はじめに
リストやタプルを扱う際のスライスについての備忘録.
動作環境
- Python 3.12.0
コマンド紹介
スライスの基本
list[sIndex:eIndex] # sIndex(最初のインデックス),eIndex(最後のインデックス)
sIndex <= x < eIndex
の範囲が選択されます.
なので,Indexの範囲としてはlist[sIndex]
~list[eIndex-1]
が選択されます.ちょっとややこしいですね.
イメージとしては,スライスで指定するインデックスは要素と要素の間を指すと考えると理解しやすいかもしれません.
スライスの使い方をおぼえる良い方法は,インデックスが文字と文字のあいだ(between)を指しており,最初の文字の左端が0になっていると考えることです.
3.12.1 Documentation » Python チュートリアル » 3. 形式ばらない Python の紹介
+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
0 1 2 3 4 5 6
-6 -5 -4 -3 -2 -1
sample = ['C', 'D', 'E', 'F', 'G', 'A', 'B']
print(sample[2:5]) # Indexが2番目から4番目まで
print(sample[:4]) # Indexが0番目から3番目まで
print(sample[3:]) # Indexが3番目から最後まで
print(sample[:-2]) # 負の数を指定するとシーケンスの末尾から数える
print(sample[-2:])
# 実行結果
['E', 'F', 'G']
['C', 'D', 'E', 'F']
['F', 'G', 'A', 'B']
['C', 'D', 'E', 'F', 'G']
['A', 'B']
ステップの指定
最初と最後のインデックスの他に,ステップの数値も指定することができます.
list[sIndex:eIndex:step] # sIndex(最初のインデックス),eIndex(最後のインデックス), step(ステップ数)
sample = ['C', 'D', 'E', 'F', 'G', 'A', 'B']
print(sample[::2]) # 最初から最後までを2つおきに出力
print(sample[1:4:2]) # Indexが1番目から3番目までを2つおきに出力
# 実行結果
['C', 'E', 'G', 'B']
['D', 'F']
ステップ数をマイナス値にすると逆順(リバース)して要素を取り出せます.
sample = ['C', 'D', 'E', 'F', 'G', 'A', 'B']
print(sample[::-1]) # 最初から最後まで逆順に要素を取り出す
print(sample[5:1:-2]) # 5番目から2番目まで逆順に2ステップずつ要素を取り出す
# 実行結果
['B', 'A', 'G', 'F', 'E', 'D', 'C']
['A', 'F']
逆順で範囲を指定して要素を取り出す際は,sIndex > eIndex
である必要があります.
多次元配列のスライス
import numpy as np
X = np.array([
[1,2,3],
[4,5,6],
[7,8,9]
])
print(X[:,1]) # 全ての配列の1番目の要素にアクセス
print(X[2,:]) # 2番目の配列のすべての要素にアクセス == X[2]
print(X[:2,1:]) # 1番目までの配列の1番目以降の要素にアクセス
# 実行結果
[2 5 8]
[7 8 9]
[[2 3]
[5 6]]