「文字列や配列の一部分だけを取り出したい」 「for文を使わずに簡単にデータを操作できないかな?」
そんな疑問をお持ちのあなたへ。
今回はスライスについて、初心者の方でも理解できるように詳しく説明していきます。
スライスを使えば、リストや文字列から必要な部分だけを簡単に抽出できます。これはpythonならではのシンプルで強力な機能なんです。
この記事を読めば、スライスの基本的な使い方から応用テクニックまで身につけることができます。
スライスとは?「データを切り取る」便利な機能

スライスとは、リストや文字列の一部分を取り出すための機能です。
まずは簡単な例から見てみましょう:
text = "Python"
print(text[0:2]) # Py
このように、[開始:終了]
という書き方で、データの一部分を「切り取る」ことができます。
スライスの基本的な書き方
データ[開始位置:終了位置]
重要なポイント:
- 開始位置は含まれる
- 終了位置は含まれない(その直前まで)
- 開始位置と終了位置を省略した場合、自動的に端が指定される
fruits = ["りんご", "バナナ", "みかん", "ぶどう", "もも"]
# 0 1 2 3 4
print(fruits[1:3]) # ['バナナ', 'みかん']
# 1番目から3番目の直前(2番目)まで
スライスの基本パターン
最初から指定した位置まで
numbers = [0, 1, 2, 3, 4, 5]
print(numbers[:3]) # [0, 1, 2] (最初から3番目の直前まで)
print(numbers[:4]) # [0, 1, 2, 3] (最初から4番目の直前まで)
指定した位置から最後まで
numbers = [0, 1, 2, 3, 4, 5]
print(numbers[2:]) # [2, 3, 4, 5] (2番目から最後まで)
print(numbers[3:]) # [3, 4, 5] (3番目から最後まで)
特定の範囲を指定
numbers = [0, 1, 2, 3, 4, 5]
print(numbers[1:4]) # [1, 2, 3] (1番目から4番目の直前まで)
print(numbers[2:5]) # [2, 3, 4] (2番目から5番目の直前まで)
すべての要素を取得
numbers = [0, 1, 2, 3, 4, 5]
print(numbers[:]) # [0, 1, 2, 3, 4, 5] (すべて)
文字列でもスライスが使える
文字列も1文字ずつの並びとして考えることができるので、スライスが使えます。
text = "Pythonプログラミング"
print(text[0:6]) # Python
print(text[6:]) # プログラミング
print(text[:6]) # Python
print(text[6:10]) # プログ
日本語の文字列でも正しく動作
japanese = "こんにちは世界"
print(japanese[0:5]) # こんにちは
print(japanese[5:]) # 世界
print(japanese[2:4]) # にち
マイナスの番号を使う(後ろから数える)

pythonでは、マイナスの番号を使って後ろから数えることができます。
text = "Python"
# P y t h o n
# 0 1 2 3 4 5 (前から)
#-6-5-4-3-2-1 (後ろから)
print(text[-2:]) # on (後ろから2文字)
print(text[:-2]) # Pyth (後ろから2文字を除いたすべて)
print(text[-4:-1]) # tho (後ろから4番目から後ろから1番目の直前まで)
ステップを指定した応用的なスライス
スライスには「ステップ」という機能もあります。これを使うと、要素を飛び飛びで取り出すことができます。
基本的な書き方
データ[開始:終了:ステップ]
2個おきに取り出す
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(numbers[::2]) # [0, 2, 4, 6, 8] (2個おき)
print(numbers[1::2]) # [1, 3, 5, 7, 9] (1番目から2個おき)
3個おきに取り出す
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(numbers[::3]) # [0, 3, 6, 9] (3個おき)
print(numbers[2::3]) # [2, 5, 8] (2番目から3個おき)
逆順にする
numbers = [1, 2, 3, 4, 5]
print(numbers[::-1]) # [5, 4, 3, 2, 1] (逆順)
text = "Python"
print(text[::-1]) # nohtyP (文字列も逆順にできる)
スライスの実践的な使い方

データの前半と後半に分ける
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 真ん中で分ける
middle = len(data) // 2 # 5
first_half = data[:middle] # [1, 2, 3, 4, 5]
second_half = data[middle:] # [6, 7, 8, 9, 10]
print("前半:", first_half)
print("後半:", second_half)
最初と最後の要素を除く
data = [0, 1, 2, 3, 4, 5, 0]
# 最初と最後を除いた部分
middle_part = data[1:-1] # [1, 2, 3, 4, 5]
print(middle_part)
文字列から拡張子を取り出す
filename = "document.txt"
# 拡張子を取り出す
extension = filename[filename.rfind('.'):] # .txt
print(extension)
# ファイル名部分を取り出す
name_part = filename[:filename.rfind('.')] # document
print(name_part)
タプルでもスライスが使える
リストや文字列だけでなく、タプルでもスライスが使えます。
colors = ("赤", "青", "緑", "黄", "紫")
print(colors[1:3]) # ('青', '緑')
print(colors[::2]) # ('赤', '緑', '紫')
print(colors[::-1]) # ('紫', '黄', '緑', '青', '赤')
スライスを使った代入と削除
スライスは値を取り出すだけでなく、代入や削除にも使えます。
スライスを使った代入
numbers = [1, 2, 3, 4, 5]
# 2番目から4番目の直前までを置き換え
numbers[1:3] = [20, 30]
print(numbers) # [1, 20, 30, 4, 5]
# 長さが違っても大丈夫
numbers[1:3] = [100, 200, 300, 400]
print(numbers) # [1, 100, 200, 300, 400, 4, 5]
スライスを使った削除
numbers = [1, 2, 3, 4, 5, 6, 7]
# 2番目から4番目の直前までを削除
del numbers[1:3]
print(numbers) # [1, 4, 5, 6, 7]
よくある間違いと注意点

範囲を超えてもエラーにならない
numbers = [1, 2, 3]
# 範囲を超えてもエラーにならない
print(numbers[1:10]) # [2, 3] (エラーにならず、ある分だけ返される)
# 単一要素アクセスとは違う
# print(numbers[10]) # ← これはエラーになる
スライスは新しいオブジェクトを作る
original = [1, 2, 3, 4, 5]
sliced = original[1:4]
# slicedを変更してもoriginalは変わらない
sliced[0] = 100
print(original) # [1, 2, 3, 4, 5] (変わらない)
print(sliced) # [100, 2, 3] (こちらだけ変わる)
単一要素とスライスの結果の違い
numbers = [1, 2, 3, 4, 5]
print(numbers[1]) # 2 (数値)
print(numbers[1:2]) # [2] (リスト)
print(type(numbers[1])) # <class 'int'>
print(type(numbers[1:2])) # <class 'list'>
スライスの便利な使い方

リストをコピーする
original = [1, 2, 3, 4, 5]
copy = original[:] # すべての要素をコピー
copy.append(6)
print(original) # [1, 2, 3, 4, 5] (変わらない)
print(copy) # [1, 2, 3, 4, 5, 6]
文字列の一部を取り出す
email = "user@example.com"
# @より前の部分(ユーザー名)
username = email[:email.find('@')] # user
# @より後の部分(ドメイン)
domain = email[email.find('@') + 1:] # example.com
print(f"ユーザー名: {username}")
print(f"ドメイン: {domain}")
データの最新N件を取得
logs = ["log1", "log2", "log3", "log4", "log5", "log6", "log7"]
# 最新3件を取得
latest_3 = logs[-3:] # ['log5', 'log6', 'log7']
print(latest_3)
よくある質問
- Qスライスで元のリストは変更される?
- A
いいえ。スライスは新しいリストや文字列を作るので、元のデータは変更されません(ただし、スライスに代入する場合は元のデータが変更されます)。
- Q開始位置が終了位置より大きい場合はどうなる?
- A
空のリストや文字列が返されます。
numbers = [1, 2, 3, 4, 5] print(numbers[3:1]) # [] (空のリスト)
- QQ:ステップに負の値を指定できる?
- A
A:はい。負の値を指定すると逆方向に進みます。
numbers = [1, 2, 3, 4, 5] print(numbers[4:1:-1]) # [5, 4, 3] (4番目から1番目へ逆順)
- Q文字列のスライスで日本語は正しく扱える?
- A
はい。pythonでは日本語も1文字として正しくカウントされます。
まとめ
pythonのスライスは、データの一部分を簡単に取り出せる便利な機能です。
今回学んだポイント
- 基本構文:
データ[開始:終了]
- 省略可能:
[:3]
(最初から)、[2:]
(指定位置から最後まで) - ステップ指定:
[::2]
(2個おき)、[::-1]
(逆順) - 応用:代入、削除、コピーにも活用可能
コメント