目的
なんやかんや使うスライスをこの際まとめなおそう
スライスとは
リストの一部を切り出す機能のこと
基本は以下のように書く
array[start : stop]
対象となるリストの始点、終点を指定することでその範囲のリストを取り出すことができる
取り出しても元のリストは保持される
取り出される範囲は「始点に指定したインデックス」から__「終点に指定したインデックスの1つ前」__なので注意
以下実行例
array = [1,3,5,7,9]
re_array = array[2:4]
print(re_array)
# [5, 7]
print(array)
# [1, 3, 5, 7, 9]
範囲外の指定
終点に範囲外の指定をしても__エラーが発生しない__
取れるとこまでで止めてくれるらしい
array = [1,3,5,7,9]
re_array2 = array[3:7]
print(re_array2)
# [7, 9]
始点・終点の省略
始点、終点の値を省略することが可能
始点を省略すれば最初から、終点を省略すれば最後まで取得される
array = [1,3,5,7,9]
re_array3 = array[:3]
print(re_array3)
# [1, 3, 5]
re_array4 = array[3:]
print(re_array4)
# [7, 9]
始点も終点も省略すると全部取り出せる
re_array5 = array[:]
print(re_array5)
# [1, 3, 5, 7, 9]
こんなことする必要はない…と思ったら意外と使い道がありそう
array = [1,3,5,7,9]
# スライスで複製
re_array5 = array[:]
# 代入で複製
cp_array = array
# 値を変更
cp_array[0] = 23
print(cp_array)
# [23, 3, 5, 7, 9]
# 元の値も変更される
print(array)
# [23, 3, 5, 7, 9]
# こっちはされない
print(re_array5)
# [1, 3, 5, 7, 9]
Pythonが参照渡しになってる関係上代入で複製すると元の値にも影響する
スライスで作ったリストは新しくリストを作り直しているようでこの影響がないらしい
ステップ
何個おきに取り出すということが指定可能
array[start : stop : step]
始点、終点の後に追加するだけ
array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
odd = array[::2]
even = array[1::2]
print(odd)
# [1, 3, 5, 7, 9]
print(even)
# [2, 4, 6, 8]
奇数番だけ、偶数番だけ取り出すなんてことが可能
もちろん上記の始点終点の指定、省略も可能
負数の指定
ステップに負の値を指定することができる
参照順は__後ろから__
rev = array[::-1]
print(rev)
# [9, 8, 7, 6, 5, 4, 3, 2, 1]
rev2 = array[::-2]
print(rev2)
# [9, 7, 5, 3, 1]
タプルでのスライス
タプルでも同じことが可能
t_array = (1, 2, 3, 4, 5, 6, 7, 8, 9)
t_odd = t_array[::2]
print(t_odd)
# (1, 3, 5, 7, 9)
ちゃんとタプルで帰ってくる
まとめ
・始点:終点:ステップの順で指定
・それぞれ省略可能
・範囲外を指定してもエラーにならない
・負数の指定で逆向き参照
・タプルでも使える
参考文献
【Python】スライス操作についてまとめ
https://qiita.com/tanuk1647/items/276d2be36f5abb8ea52e