概要
リストのスライスについてまとめる。リスト要素にアクセスするために[]
で要素を指定する、その方法。
1次元
要素の指定方法
まず標準的な方法。
[開始値]:[終了値]
を指定して、複数の要素をリストとして取り出せる。開始値・終了値のいずれかを省略すると、それぞれ先頭・最後尾に対応し、両方とも省略すると”全ての要素”を意味する。
Pythonのリストでは、要素位置は0から始まり、”終了値”は”その1つ手前の要素まで”を意味する。
特に開始値と終了値を省略した[:]
の表記は、すべての要素を示す。
1 2 3 4 5 6 |
a = [0, 1, 2, 3, 4] print(a) # [0, 1, 2, 3, 4] print(a[2:4]) # [2, 3] print(a[2:]) # [2, 3, 4] print(a[:3]) # [0, 1, 2] print(a[:]) # [0, 1, 2, 3, 4] |
[開始値]<[終了値]
でなければならない(終了値が最終要素の位置+1 であることに注意)。この条件に満たないときは、エラーにならず空のリストが返される。
1 2 3 |
print(a[2:2]) # [] print(a[2:3]) # [2] print(a[3:2]) # [] |
終端からの指定
要素位置を負の数で指定した場合、最後尾の要素からの位置指定になる。-1は最後尾の要素の位置で、-2、‐3はその1つ前、2つ前の要素。
要素位置を負数で指定する場合も、[開始値]<[終了値]
というルールは同じ。
1 2 3 4 |
print(a[-1]) # 4 print(a[-4:-1]) # [1, 2, 3] print(a[-4:4]) # [1, 2, 3] print(a[1:-1]) # [1, 2, 3] |
先頭要素、最後尾要素の指定
1次元のリストの先頭要素、最後尾要素の指定方法は以下の通り。
1 2 3 |
print(a[0]) # 0 print(a[-1]) # 4 print(a[len(a) - 1]) # 4 |
2次元
シンプルな2次元配列のリストの場合。
1 2 3 4 5 6 7 8 9 |
b = [[10, 11, 12, 13, 14], [20, 21, 22, 23, 24], [30, 31, 32, 33, 34], [40, 41, 42, 43, 44]] print(b) print(b[1][2]) # [[10, 11, 12, 13, 14], [20, 21, 22, 23, 24], [30, 31, 32, 33, 34], [40, 41, 42, 43, 44]] # 22 |
行の抽出
第1引数だけを指定すると、2次元配列の場合は指定した行を抽出。スライスで指定した場合は対応する行が抽出される。
1 2 3 4 5 6 7 8 9 |
print(b[2]) print(b[1:3]) print(b[-1]) print(b[:]) # [30, 31, 32, 33, 34] # [[20, 21, 22, 23, 24], [30, 31, 32, 33, 34]] # [40, 41, 42, 43, 44] # [[10, 11, 12, 13, 14], [20, 21, 22, 23, 24], [30, 31, 32, 33, 34], [40, 41, 42, 43, 44]] |
特定の行のスライスは以下のように指定。
1 2 3 |
print(b[2][1:4]) # [31, 32, 33] |
列の抽出
第1引数で行のスライスを指定したうえで列方向の要素を取り出そうとi意図して、以下のように指定するとエラー。
1 2 3 |
print(b[1:3][2]) # IndexError: list index out of range |
さらに第1引数を[:][n]
のように指定すると、n行目が取り出されてしまう。
1 2 3 4 |
print(b[:][0]) # [10, 11, 12, 13, 14] print(b[:][1]) # [20, 21, 22, 23, 24] print(b[:][2]) # [30, 31, 32, 33, 34] print(b[:][3]) # [40, 41, 42, 43, 44] |
リストの内包表記で、取り出す行を変数にするとうまくいく。
1 2 3 4 |
print([r[0] for r in b]) # [10, 20, 30, 40] print([r[1] for r in b]) # [11, 21, 31, 41] print([r[2] for r in b]) # [12, 22, 32, 42] print([r[3] for r in b]) # [13, 23, 33, 43] |