1. ホーム
  2. python

[解決済み] Python リストエラーです。[1]スライスの[::-1]ステップ

2022-03-04 20:24:06

質問

Pythonでリストスライスの基本を理解したつもりでしたが、以下のようにスライスで負のステップを使用しているときに予期せぬエラーが発生しました。

>>> a = list(range(10))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[:-1]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> a[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> a[:-1:-1]
[]

(これはPython 3.5で実行されていることに注意してください)

なぜa[:-1:-1]はa[::-1]でリスト全体を通過するのと同じようにa[:-1]スライスを逆ステップで通過しないのですか?

list.reverse()も同様に使用できることは理解していますが、根本的なパイソンのスライス機能をよりよく理解しようとしているのです。

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

最初の -1a[:-1:-1] は、あなたが考えているような意味ではないのです。

スライシングでは、負の開始/終了インデックスは文字通りに解釈されません。その代わり、それらはリストの終わりを便利に参照するために使われます(つまり、それらは len(a) ). これはスライスの方向とは無関係に起こります。

これは、次のことを意味します。

a[:-1:-1]

は、以下と同等です。

a[:len(a)-1:-1]

逆方向スライスの際に省略された場合、開始インデックスはデフォルトで len(a)-1 となり、上記は以下と同等となります。

a[len(a)-1:len(a)-1:-1]

開始インデックスと終了インデックスが同じで、終了インデックスは排他的であるため、これは常に空リストとなります。

0番目の要素まで、およびそれを含めて逆方向のスライスを行うには、次のいずれかの表記を使用します。

>>> a[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> a[:None:-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> a[:-len(a)-1:-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]