メインコンテンツへスキップ
Lesson3 / 8

リストのスライス

目次

1. このレッスンで学ぶこと

  • スライスとは何か
  • スライスの基本構文
  • ステップを使ったスライス
  • スライスの実用的な使い方

2. スライスとは

スライスは、リストの一部分(連続した複数の要素)を取り出す操作です。開始位置から終了位置までの範囲を指定して新しいリストを作成します。

項目説明
基本形式リスト[開始:終了:ステップ]
開始:終了開始は含む、終了は含まない
デフォルト省略可能(先頭と末尾が自動設定)
新規作成元のリストは変更されない

主な特徴:

  • 複数の要素を一度に取得できる
  • スライスは新しいリストを作成する(元のリストは変更されない)
  • ステップを指定して間隔を空けることも可能
  • 負のインデックスで後ろからの指定ができる

簡単なコード例:

Python
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# スライスで一部取得
print(numbers[2:5])   # インデックス2から4まで
print(numbers[:3])    # 先頭から3個
print(numbers[5:])    # インデックス5から末尾まで
print(numbers[-3:])   # 最後の3個
print(numbers[::2])   # 2個おきに取得
print(numbers[::-1])  # 逆順

実行結果:

[2, 3, 4]
[0, 1, 2]
[5, 6, 7, 8, 9]
[7, 8, 9]
[0, 2, 4, 6, 8]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

3. なぜスライスが必要なのか?

リストの一部分(範囲)を取り出したいとき、スライスを使うと簡潔に書けます。

Python
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# スライスを使わない場合(面倒)
subset = []
for i in range(2, 5):
    subset.append(numbers[i])
print(subset)

# スライスを使う場合(簡潔)
subset = numbers[2:5]
print(subset)

実行結果:

[2, 3, 4]
[2, 3, 4]

スライスを使うことで、リストの一部を効率的に取り出せます。

💡 豆知識: スライスは「切り取る」という意味です。リストを切り取って一部分を取り出すイメージです。この機能はPythonの強力な特徴の一つで、コードを非常に簡潔に書けます。


4. スライスの基本

スライスの構文

機能: リストの指定範囲の要素を取り出して新しいリストを作成します。

書き方:

Python
リスト[開始:終了]
リスト[開始:終了:ステップ]

用途: 範囲取得、部分リストの作成、リストのコピー

注意点:

  • 開始は含む、終了は含まない
  • 省略可能(デフォルト値がある)
  • 元のリストは変更されない
Python
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 基本的なスライス
print(numbers[2:5])   # インデックス2から4まで
print(numbers[0:3])   # インデックス0から2まで
print(numbers[5:8])   # インデックス5から7まで

実行結果:

[2, 3, 4]
[0, 1, 2]
[5, 6, 7]

5. 基本的なスライス

開始と終了を指定

Python
fruits = ["りんご", "バナナ", "オレンジ", "ぶどう", "メロン"]

# インデックス1から3まで(3は含まない)
print(fruits[1:3])

# インデックス0から2まで
print(fruits[0:2])

# インデックス2から4まで
print(fruits[2:4])

実行結果:

['バナナ', 'オレンジ']
['りんご', 'バナナ']
['オレンジ', 'ぶどう']

開始を省略

機能: 開始位置を省略すると、先頭から取得します。

書き方:

Python
リスト[:終了]  # 先頭から終了-1まで

用途: 先頭からn個取得、前半部分の取得

注意点: [:n]は最初のn個を取得

Python
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 先頭から5個
print(numbers[:5])

# 先頭から3個
print(numbers[:3])

実行結果:

[0, 1, 2, 3, 4]
[0, 1, 2]

終了を省略

機能: 終了位置を省略すると、末尾まで取得します。

書き方:

Python
リスト[開始:]  # 開始から末尾まで

用途: n番目以降を取得、後半部分の取得

注意点: [n:]はn番目から最後まで

Python
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# インデックス5から最後まで
print(numbers[5:])

# インデックス7から最後まで
print(numbers[7:])

実行結果:

[5, 6, 7, 8, 9]
[7, 8, 9]

両方を省略

機能: 開始と終了を省略すると、リスト全体をコピーします。

書き方:

Python
リスト[:]  # リスト全体のコピー

用途: リストの複製、元のリストを保持したまま操作

注意点: シャローコピー(浅いコピー)が作られる

Python
original = [1, 2, 3, 4, 5]

# リスト全体をコピー
copied = original[:]

print(f"元のリスト: {original}")
print(f"コピー: {copied}")

# コピーを変更しても元は変わらない
copied[0] = 100
print(f"変更後の元: {original}")
print(f"変更後のコピー: {copied}")

実行結果:

元のリスト: [1, 2, 3, 4, 5]
コピー: [1, 2, 3, 4, 5]
変更後の元: [1, 2, 3, 4, 5]
変更後のコピー: [100, 2, 3, 4, 5]

6. 負のインデックスでスライス

後ろから指定

Python
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 最後の3個
print(numbers[-3:])

# 最後から5個目から最後まで
print(numbers[-5:])

# 最初から最後の2個を除く
print(numbers[:-2])

# 最後から5個目から最後の2個を除く
print(numbers[-5:-2])

実行結果:

[7, 8, 9]
[5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7]
[5, 6, 7]

7. ステップを使ったスライス

ステップの指定

機能: 要素を飛ばしながら取得します。

書き方:

Python
リスト[開始:終了:ステップ]

用途: n個おきに取得、逆順、偶数/奇数インデックス

注意点: ステップが負の場合は逆方向

Python
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 2個おきに取得
print(numbers[::2])

# 3個おきに取得
print(numbers[::3])

# インデックス1から8まで2個おき
print(numbers[1:8:2])

実行結果:

[0, 2, 4, 6, 8]
[0, 3, 6, 9]
[1, 3, 5, 7]

リストの逆順

機能: リストを逆順にします。

書き方:

Python
リスト[::-1]

用途: 逆順のリスト作成、パリンドローム判定

注意点: 元のリストは変更されない

Python
numbers = [1, 2, 3, 4, 5]

# 逆順
reversed_numbers = numbers[::-1]
print(f"元のリスト: {numbers}")
print(f"逆順: {reversed_numbers}")

# 文字のリストを逆順
chars = ['a', 'b', 'c', 'd', 'e']
print(chars[::-1])

実行結果:

元のリスト: [1, 2, 3, 4, 5]
逆順: [5, 4, 3, 2, 1]
['e', 'd', 'c', 'b', 'a']

8. 具体例

例1: 先頭と末尾の除去

Python
data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 最初の2個と最後の2個を除く
middle = data[2:-2]
print(f"元のデータ: {data}")
print(f"中央部分: {middle}")

実行結果:

元のデータ: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
中央部分: [2, 3, 4, 5, 6, 7]

例2: データの分割

Python
scores = [85, 92, 78, 95, 88, 76, 90, 82]

# 前半と後半に分割
mid = len(scores) // 2
first_half = scores[:mid]
second_half = scores[mid:]

print(f"全体: {scores}")
print(f"前半: {first_half}")
print(f"後半: {second_half}")

実行結果:

全体: [85, 92, 78, 95, 88, 76, 90, 82]
前半: [85, 92, 78, 95]
後半: [88, 76, 90, 82]

例3: 偶数・奇数インデックス

Python
items = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']

# 偶数インデックス(0, 2, 4, ...)
even_index = items[::2]

# 奇数インデックス(1, 3, 5, ...)
odd_index = items[1::2]

print(f"偶数インデックス: {even_index}")
print(f"奇数インデックス: {odd_index}")

実行結果:

偶数インデックス: ['A', 'C', 'E', 'G']
奇数インデックス: ['B', 'D', 'F', 'H']

9. スライスの応用

スライスでの代入

Python
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(f"元のリスト: {numbers}")

# 一部を置き換え
numbers[2:5] = [20, 30, 40]
print(f"置き換え後: {numbers}")

# 異なる長さでも可能
numbers[1:4] = [100, 200]
print(f"長さ変更: {numbers}")

実行結果:

元のリスト: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
置き換え後: [0, 1, 20, 30, 40, 5, 6, 7, 8, 9]
長さ変更: [0, 100, 200, 40, 5, 6, 7, 8, 9]

スライスでの削除

Python
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(f"元のリスト: {numbers}")

# 一部を削除(空リストで置き換え)
numbers[2:5] = []
print(f"削除後: {numbers}")

実行結果:

元のリスト: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
削除後: [0, 1, 5, 6, 7, 8, 9]

10. 練習問題

問題1(基礎)⭐☆☆

リスト [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] から [2, 3, 4, 5] を取り出してください。

💡 ヒント

開始は2、終了は6です。

✅ 解答例
Python
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
result = numbers[2:6]
print(result)

実行結果:

[2, 3, 4, 5]

解説: インデックス2から5まで(6は含まない)を取得しています。


問題2(基礎)⭐☆☆

リスト [1, 2, 3, 4, 5] を逆順にしてください。

💡 ヒント

ステップに-1を指定します。

✅ 解答例
Python
numbers = [1, 2, 3, 4, 5]
reversed_numbers = numbers[::-1]
print(reversed_numbers)

実行結果:

[5, 4, 3, 2, 1]

解説: [::-1]でリスト全体を逆順にできます。


問題3(応用)⭐⭐☆

リスト [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] から偶数インデックスの要素だけを取り出してください。

💡 ヒント

ステップを2にします。

✅ 解答例
Python
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
even_index = numbers[::2]
print(even_index)

実行結果:

[0, 2, 4, 6, 8]

解説: [::2]で偶数インデックス(0, 2, 4, ...)の要素を取得できます。


11. まとめ

このレッスンでは、スライスでリストの一部を取り出す方法を学びました。

  • list[start:end:step] の基本構文で部分列を柔軟に取得できます。
  • 開始・終了・ステップの省略ルールを理解して使い分けられます。
  • 負のステップを使うことで逆順の取り出しも可能です。
  • スライスは元リストを変更せず、新しいリストを返す点を確認しました。
  • 範囲指定を明示して書くことで、可読性と安全性が向上します。