Pythonでリストや文字列を操作できるスライスがあります。
スライスを使うとリストを後ろから逆順に取得したり、1つ飛ばしするのも自由自在。
だけど…
『そもそもスライスって何?』
『リストや文字列をどうやって逆順するの?』
『リストや文字列をどうやって1つ飛ばしにするの?』
こんな疑問に答えます。
【Python】スライスとは?
スライスとはリストや文字列、タプル等のシーケンスオブジェクトをインデックスを指定して取り出す操作のことです。
シーケンス[開始:終了:間隔]
開始・終了・間隔(step)は、それぞれ省略可能です。
開始・終了・間隔(step)の考え方はrange関数の引数と似ています。
参考…【Python】range関数で1から連番・飛ばしの間隔・逆順など
次のリストで、色々と指定してみましょう。
/* リスト(シーケンスオブジェクト) */
x = ['a', 'b', 'c']
境界のイメージはこんな感じです。
x[0]は要素’a’、x[1]は要素’b’、x[2]は要素’c’を参照します。
インデックス0が起源として順番に指定するので、0(ゼロ)オリジンといいます。
この考え方はとても大切なので覚えといてね♪
また、
要素をインデックスで順番に取得できるものをシーケンスオブジェクトといいます。
リストはシーケンスオブジェクトです。
開始・終了・間隔を全て省略
x[::]
['a', 'c', 'b']
開始・終了・間隔を省略すると、全ての値が取得できてますね。
開始・終了は省略、間隔は1
x[::1]
['a', 'b', 'c']
これも全ての値が取得できてますね♪
開始と終了を指定・間隔は1
x[0:2:1]
['a', 'b']
x[0:3:1]
['a', 'b', 'c']
x[1:3:1]
['b', 'c']
開始から終了インデックス未満迄の値が取得できてますね。
終了は未満というところが大きなポイントです。
終了インデックスを指定しても、未満なので取得できないのでご注意を!
シーケンスオブジェクトなら全て同じ(リスト・文字列・rangeなど)
シーケンスオブジェクトならスライスの使い方は全て同じです。
タプル・文字列・rangeでもリストと同じようにスライスできます♪
また、
range関数でもスライスと似た使い方でで連番を作成できます。ご参考まで。
【Python】リストや文字列をスライスで後ろから取得
スライスの書式は下記でしたね。
シーケンス[開始:終了:間隔]
リストや文字列をスライスで後ろから取得する指定は間隔を-1とします。
スライスで逆順にする指定方法は
シーケンス[::-1]
です。
次のリストを元に色々と指定してみましょう。
/* リスト(シーケンスオブジェクト) */
x = ['a', 'b', 'c']
ゼロオリジンの考え方は大切なので、もう1度おさらいしましょう。
x[0]は要素’a’、x[1]は要素’b’、x[2]は要素’c’を参照します。
インデックス0が起源として順番に指定するので、0(ゼロ)オリジンといいます。
開始・終了を省略、間隔を-1
x[::-1]
['c', 'b', 'a']
逆順になってますね。
開始と終了を指定・間隔は-1
x[2:0:-1]
['c', 'b']
終了値は未満なので、’a’は取得できてないですね。
x[3:0:-1]
['c', 'b']
これも終了値は未満なので、’a’は取得できてないですね。
存在しない開始位置3を指定してもエラーとなりません
x[2:-1:-1]
[]
あれれ?何も取得できませんね。
実はインデックスには正のインデックスと負のインデックスがあります。
負のインデックス-1と正のインデックス2は同じ’C’を指しているのです。
つまり、
開始位置~終了位置未満となり何も取得できないのです。
ここはポイントですよ!
イメージはこんな感じ
正のインデックス2と負のインデックス-1は同じ位置ですね。
ゼロオリジンの考え方を覚えていますか?
ゼロオリジンは正のインデックスの考え方です。
負のインデックスと踏まえると次のようなことが言えます。
-
- 正のインデックス
開始値がインデックス0(0オリジン)
開始値から1づつ増やす考え方 - 負のインデックス
終了値がインデックス-1(-1オリジン)
終了値から1づつ減らす考え方
- 正のインデックス
開始値から1づつ増やす考え方が正のインデックス
終了値から1づつ減らす考え方が負のインデックス
です。
ちなみに、0オリジンは業界で良く聞きますが、-1オリジンは聞きません。
-1オリジンはオッサンの造語です。あしからず。
では、話を戻しましょう。
正と負のインデックスの考え方より、
x[2:-1:-1]とx[2:2:-1]は同じ値(空っぽ)
となることがわかりましたか?
x[2:2:-1]は開始位置~終了位置未満だから、何も取得できない(空っぽ)なのです。
実際に試してみましょう。
x[2:2:-1]
[]
開始位置~終了位置未満となり何も取得できてませんね。
重要ポイントです! 色々、試してみましょう♪
例)正のインデックス
x[1]
'b'
正のインデックス[1]でbを取得しました。
例)負のインデックス
x[-2]
'b'
負のインデックス[-2]でbを取得しました。
x[-1:-4:-1]
['c', 'b', 'a']
開始と終了に負インデックスを正しく指定したので、後ろから逆順に取得できました!
開始を指定・終了は省略・間隔は-1
x[1::-1]
['b', 'a']
終了値を省略すると’a’が取得できてますね。
※追記 2022/10/14※
開始を-1、終了を-4、Stepを-1 としても上手く逆順に取得でます。
x[-1:-4:-1]
['c', 'b', 'a']
ちゃんと逆順に取得できますねー
マイナスインデックスは開始と終了の考え方がのややこしいですね。
逆順だと更に頭の中がこんがらがります。
開始・終了を末尾にしたい場合は、素直に省略した方が良さそう。
あいやー、正直なところマイナスのインデックスは違和感がありまくりです。
VBやC#だとマイナスのインデックスはIndexOutofExceptionが発生しますし。
(ここまで書いておきながらなんですが、あっているのか少し不安になります。
もし間違ってたらコメントください^^;)
reverceやreversed関数でも逆順にできます。
~リストをreverse・reversedで逆順にしたい場合はこちら~
range関数でも後ろから逆順の連番が作成できます。
~range関数で後ろから逆順の連番はこちら~
色々、お試しあれ。
【Python】リストや文字列をスライスで1つ飛ばしで取得
スライスの書式は下記でしたね。
シーケンス[開始:終了:間隔]
リストや文字列をスライスで1つ飛ばしで取得する指定は間隔を2とします。
間隔とはカウントアップで増える量のことです。
間隔が2の場合は2づつ増えてカウントアップされます。
間隔が2の場合は2づつ増えてカウントアップ
0,2,4,6 … です。
階段でいうと1段飛ばしですね♪。
リストや文字列でも同じです。
リストや文字列をスライスで1つ飛ばしにする指定は
シーケンス[::2]
となります。
次のリストを元に指定してみましょう。
/* リスト(シーケンスオブジェクト) */
x = ['a', 'b', 'c']
x = [‘a’, ‘b’, ‘c’]は、x[1]でインデックスを指定して要素’b’を参照できます。
x[0:3:2]
['a', 'c']
1つ飛ばしで取得できてますね!
また、
range関数で1つ飛ばしの連番を作成できます。
~range関数で1つ飛ばしの連番はこちら~
【Python】シーケンスオブジェクトとは?リスト・文字列・rangeなど
リスト・タプル・文字列・rangeはシーケンスオブジェクトです。
シーケンスオブジェクトとは、
集約された要素をインデックス指定できるオブジェクトです。
リストを例をあげてみましょう。
/* リスト(シーケンスオブジェクト) */
x = ['a', 'b', 'c']
x = [‘a’, ‘b’, ‘c’]は、x[1]でインデックスを指定して要素’b’を参照できます。
要素をインデックス指定できるので、リストはシーケンスオブジェクトです。
シーケンスとは順番という意味を持ちます。
インデックスを順番にx[0]、x[1]、x[2]という風に指定できますよね。
だから、シーケンスオブジェクトなのです。
インデックス(シーケンス)を逆順に指定すると…
x[2]、x[1]、x[0] となります。
そうすると、リストの要素は
[‘c’, ‘b’, ‘a’] となります。
ちゃんと逆順になってますね。
インデックスを逆順に指定すると、リストの要素も逆順になるのです。
スライスやreverse・reversed関数も内部的には、このような仕組みで動いています。
他のプログラミングでは「配列」に近いイメージです。
「記事を読んでもわからないトコがある」「内容が変だよ」
という時は、お気軽にコメントください♪
「もっとSEおっさんに詳しく聞きたい。何かお願いしたい!」
という時は、ココナラまで。メッセージもお気軽に♪
LINEでのお問合わせも受付中!
LINE公式アカウント
メッセージをお待ちしています!
- 応用情報技術者
- Oracle Master Gold
- Java SE Gold
- Java EE Webコンポーネントディベロッパ
- Python エンジニア認定データ分析
- 簿記2級