🔰[python3]スライスでシーケンスの一部を取り出す

スライスとは

リスト・文字列・タプルなどのシーケンス(順番のあるもの)の一部を取り出す操作をスライスといいます。

スライスの基本

開始位置startと終了位置stopで[start:stop]と表し、これはstart以上stop未満の範囲を表します。
stopの位置は含まれないので注意が必要です。

print("abcde"[1:3])#bc
例えばリストlist_1の2番目から4番目までを取得したい場合はlist_1[2:4+1]とすればできます。

(増分がプラスのときは)位置を省略すると開始位置は先頭に、終了位置は末尾+1になります。

print("abcde"[:3])#abc
print("abcde"[3:])#de
要素数を超える位置は要素数と同じになります。
print("abcde"[3:6])#de
#!/usr/bin/env python3

list_1=["a","b","c","d","e"]

#位置2から3までの要素を取得
print(list_1[2:4])
#['c', 'd']

#0は先頭の要素
print(list_1[0:3])
#['a', 'b', 'c']

#開始位置を省略すると先頭の要素
print(list_1[:3])
#['a', 'b', 'c']

#最後の要素はリストの要素数で取得できる
print(list_1[2:5])
#['c', 'd', 'e']

#終了位置を省略するとリストの要素数になる
print(list_1[2:])
#['c', 'd', 'e']

#リストの要素数を超えてもリストの要素数と同じ
print(list_1[2:6])
#['c', 'd', 'e']

#開始位置と終了位置を省略すると全ての要素を取得
print(list_1[:])
#['a', 'b', 'c', 'd', 'e']

#2以上2未満の位置なので何もなし
print(list_1[2:2])
#[]

#2以上1未満の位置なので何もなし
print(list_1[2:1])
#[]

マイナスの位置

位置-1は末尾の要素を表し、-2は末尾から2番目となり、先頭要素はマイナスの要素数となります。

print("abcde"[-4:-2])#bc
先頭要素より少ない位置はマイナス要素数にマイナス1した位置で表し、それより少ない位置は-要素数-1と同じになります(増分がマイナスのときに使う)。
print("abcde"[2:-6:-1])#cba
先頭要素より少ない位置は-要素数-1以下、末尾要素より多い位置は要素数+1以上となるということです。 位置-1が末尾の要素なので、最後の要素も追加しようとして+1して0にすると先頭の要素になるので注意が必要です。
print("abcde"[2:0])#
マイナスの位置はその要素数を一度だけプラスさせても同じ位置になると考えると分かりやすいです。 例えば要素数5のとき、-1の位置は4と同じ、-3の位置は2の位置と同じ、-5の位置は先頭の位置、-6の位置は-1となり先頭-1と考えます。
print("abcde"[-4:-2])#bc
#!/usr/bin/env python3

list_1=["a","b","c","d","e"]

#2以上4(=-1+5)未満の位置
print(list_1[2:-1])
#['c', 'd']

#-1の位置からもう一文字追加しようとすると先頭に戻る
print(list_1[2:0])
#[]

#0以上2未満の位置
print(list_1[-5:-3])
#['a', 'b']

#要素数以上のマイナスは先頭になる
print(list_1[-6:-3])
#['a', 'b']

#0以上2未満の位置
print(list_1[-7:-3])
#['a', 'b']

#4以上3未満の位置
print(list_1[-1:3])
#[]

スライスの増分

スライスを使って[start:stop]で要素を取り出すとき指定した個数毎に取り出したいときは、その増分stepを使って、[start:stop:step]とします。
増分が省略されている場合は1となります。

print("abcde"[1:4:2])#bd
#!/usr/bin/env python3

list_1=["a","b","c","d","e"]

#増分を省略すると1となる。
print(list_1[2:4:])
#['c', 'd']

#0,2番目の要素が取り出されます
print(list_1[0:4:2])
#['a', 'c']

#0,2番目の要素が取り出されます
print(list_1[0:3:2])
#['a', 'c']

#1,3番目の要素が取り出されます
print(list_1[1:4:2])
#['a', 'c']

マイナスの増分

増分がマイナスのときは、開始位置から始めて増分を引いていき終了位置を超過している間の要素だけを取得します。

print("abcde"[3:1:-1])#dc
増分がマイナスのときに開始位置を省略すると末尾の位置になり、終了位置を省略すると先頭-1の位置になります。
print("abcde"[:2:-1])#ed
print("abcde"[2::-1])#cba
また[::-1]とするとリバースできます。
print("abcde"[::-1])#edcba
#!/usr/bin/env python3

list_1=["a","b","c","d","e"]

#リバース
print(list_1[::-1])
#['e', 'd', 'c', 'b', 'a']

#4,3,2,1の位置が選択されるので先頭は選ばれない
print(list_1[4:0:-1])
#['e', 'd', 'c', 'b']

#リバースを省略せずに書く
print(list_1[4:-6:-1])
#['e', 'd', 'c', 'b', 'a']

#4,3,2の位置を取り出す
print(list_1[4:1:-1])
#['e', 'd', 'c']

#4,2の位置を取り出す
print(list_1[4:1:-2])
#['e', 'c']

#[3:1:-1]と同じで3,2の位置を取り出す
print(list_1[-2:-4:-1])
#['d', 'c']

#[3:1:-2]と同じで3の位置を取り出す
print(list_1[-2:-4:-2])
#['d']

スライスの位置まとめ

要素数をnとする。
このとき、

  • 先頭(0番目)の要素は位置0又は-n
  • 1番目の要素は位置1又は-n+1
  • n-2番目の要素は位置n-2又は-2
  • 末尾(n-1番目)の要素は位置n-1又は-1

となり、

  • 先頭より少ない位置は-n-1以下の整数
  • 末尾より多い位置はn以上の整数

で表される。

ページ情報

タイトル

🔰[python3]スライスでシーケンスの一部を取り出す

URL

https://www.nomuramath.com/vpnov76i/

SNSボタン