1. ホーム
  2. python

[解決済み] スライス表記を理解する

2022-03-13 14:38:15

質問

Pythonのスライス表記について、良い説明(参考文献があれば尚可)が欲しいです。

私にとって、この記法は少しピックアップする必要があります。

非常に強力に見えるのですが、いまいちピンときていません。

どのように解決するのか?

とても簡単なことなんです。

a[start:stop]  # items start through stop-1
a[start:]      # items start through the rest of the array
a[:stop]       # items from the beginning through stop-1
a[:]           # a copy of the whole array

また step の値で、上記のいずれにも使用できます。

a[start:stop:step] # start through not past stop, by step

重要なポイントは :stop という最初の値を表します。 ではない を選択したスライスの そのため stopstart は選択された要素の数です(もし step は1、デフォルト)。

もう一つの特徴は start または stop ネガティブ これは、配列の先頭ではなく末尾からカウントすることを意味します。つまり

a[-1]    # last item in the array
a[-2:]   # last two items in the array
a[:-2]   # everything except the last two items

同様に step は負の数であってもよい。

a[::-1]    # all items in the array, reversed
a[1::-1]   # the first two items, reversed
a[:-3:-1]  # the last two items, reversed
a[-3::-1]  # everything except the last two items, reversed

Pythonは、要求した数よりも少ない数の項目があれば、プログラマに親切です。例えば、もしあなたが a[:-2]a が1つの要素しか含んでいない場合、エラーの代わりに空のリストが表示されます。エラーの方がいい場合もあるので、このようなことが起こる可能性があることを認識しておく必要があります。

との関係 slice() オブジェクト

スライス演算子 [] は、実際には上記のコードに slice() オブジェクトを使用しています。 : の中でしか有効ではありません。 [] )、すなわち

a[start:stop:step]

とは等価である。

a[slice(start, stop, step)]

スライスオブジェクトも引数の数によって挙動が若干異なりますが、同様に range() つまり slice(stop)slice(start, stop[, step]) がサポートされています。 引数の指定を省略したい場合は,以下のようにします。 None というように、例えば a[start:] と同じです。 a[slice(start, None)] または a[::-1] と同じです。 a[slice(None, None, -1)] .

一方 : -ベースの記法は単純なスライスに非常に便利ですが、明示的に slice() オブジェクトを使用することで、プログラムによるスライスの生成を簡略化することができます。