Python

Pythonのリストのインデックス・スライスについて解説

By 2022年3月19日No Comments

本記事では、Pythonのリストのインデックス・スライスについて解説します。

インデックスやスライスを用いることで、リストの特定の要素にアクセスしたり、アクセスする要素の範囲などを指定したりすることができるようになります。

インデックスの基本

Pythonでは、リストの特定の要素にアクセスしたいときはインデックス番号を指定します。リストの先頭は「0」番であることに注意してください。

リスト[インデックス番号]

arr = ['a', 'b', 'c', 'd', 'e']

print(arr[0])
print(arr[3])

(出力結果)

a
d

インデックスは負の値を指定することもできます。負の値の場合は後ろから順番に「-1, -2, -3 …」と指定します。正のインデックスと違い「1」番から始まることに注意してください。

arr = ['a', 'b', 'c', 'd', 'e']

print(arr[-1])
print(arr[-5])

(出力結果)

e
a

インデックスと要素の対応は下図のようになります。

要素abcde
インデックス(正)01234
インデックス(負)-5-4-3-2-1

なお、存在しないインデックスを指定したときはエラーとなります。

arr = ['a', 'b', 'c', 'd', 'e']

print(arr[5])
print(arr[-6])

(出力結果)

IndexError: list index out of range

スライスの基本

1. スライスでリストの範囲指定をする

スライスを用いると、アクセスしたいリストの要素の範囲を指定することができます。

コードでは以下のように書きます。

リスト[開始:終了]

「開始」では、アクセスしたい要素の先頭を指定します。

「終了」では、アクセスしたい要素の末尾より「1つ先」を指定します。

arr = ['a', 'b', 'c', 'd', 'e']

# 前から0番目 ~ 前から3番目「の1つ手前まで」
print(arr[0:3])

# 前から2番目 ~ 前から4番目「の1つ手前まで」
print(arr[2:4]) 

(出力結果)

['a', 'b', 'c']
['c', 'd']

インデックス指定に負の値を入力することもできます。

arr = ['a', 'b', 'c', 'd', 'e']

print(arr[-4:-2]) 

(出力結果)

['b', 'c']

少々わかりにくいかもしれませんが、[-4:-2]であれば、「後ろから4番目の要素から始まり、1つずつ先頭方向に進み、後ろから2番目の要素の1つ手前まで」という解釈になります。

終了位置に関しては、リストの末尾を超えるインデックスを指定しても問題ありません。その場合、範囲指定は末尾までとなります。

arr = ['a', 'b', 'c', 'd', 'e']

print(arr[0:100])

(出力結果)

['a', 'b', 'c', 'd', 'e']

終了位置や開始位置を省略することもできます。開始位置を省略した場合は0番目始まり、終了位置を省略した場合は末尾までの範囲指定となります。

arr = ['a', 'b', 'c', 'd', 'e']

print(arr[:3]) # 先頭から3番目まで
print(arr[1:]) # 1番目から末尾まで

(出力結果)

['a', 'b', 'c']
['b', 'c', 'd', 'e']

以上のように開始位置と終了位置を指定することでリストの中でアクセスしたい範囲を決定できます。

2. スライスでステップを指定する

上記ではリストの範囲を指定することができましたが、「何個毎に要素を拾ってくるか」を指定することもできます。「何個毎」というのはステップ数と言い、コードでは以下のように書きます。

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

arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g']

# ステップを指定しない場合
print(arr[1:6])

# 「2」ステップ毎に拾ってくる
print(arr[1:6:2]) 

(出力結果)

['b', 'c', 'd', 'e', 'f']
['b', 'd', 'f']

以上のように、指定した範囲内で何個ごとかに要素を拾ってくることができます。

ステップ数を負の値にすると、決定した範囲の後ろから要素を拾ってきます。

arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g']

# ステップ数が-1の場合
print(arr[6:1:-1])

# 後ろから2ステップ毎の場合
print(arr[6:1:-2])

(出力結果)

['g', 'f', 'e', 'd', 'c']
['g', 'e', 'c']

ステップ数を負の値で指定する場合、範囲の開始位置と終了位置の指定は、開始位置が後ろで終了位置が前の順序になることに注意してください。

ステップ数を-1にすると後ろから1つずつリストにアクセスする性質を利用して、以下のようにリストを逆順にすることもできます。

arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g']

print(arr[::-1])

(出力結果)

['g', 'f', 'e', 'd', 'c', 'b', 'a']

上記のコードは、開始位置と終了位置を指定していないため範囲は「全範囲」となり、ステップ数を-1にすることでリストの後ろから1つずつアクセスする動作を実現しています。

上記のコードはよく用いられるので覚えておくと便利でしょう。

まとめ

・リスト[インデックス番号]で、リストの特定の要素にアクセスすることができる。リストの先頭は「0」番始まり、リストの末尾は「-1」番始まりであることに注意。

・リスト[開始:終了]で、リストのアクセスしたい範囲を指定することができる。終了位置のインデックスは、「1つ手前」までであることに注意。

・リスト[開始:終了:ステップ]で、指定した範囲から何個ごと(何ステップごと)に要素にアクセスするかを指定することができる。ステップ数を負の値にする場合、範囲指定は「後ろから前」の順で指定しなければならないことに注意。

Udemyの動画学習でもPythonを勉強しよう!

「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!

UdemyのPythonおすすめ33講座レビューリスト
HOSL

Author HOSL

More posts by HOSL