web-dev-qa-db-ja.com

スライス表記を使用したリストの反転

次の例では:

foo = ['red', 'white', 'blue', 1, 2, 3]

ここで:foo[0:6:1]は、fooのすべての要素を出力します。しかしながら、 foo[6:0:-1]は、1番目または0番目の要素を省略します。

>>> foo[6:0:-1]
[3, 2, 1, 'blue', 'white']

Foo.reverse()またはfoo [::-1]を使用してリストを逆に印刷できることを理解していますが、foo [6:0:-1]がリスト全体を印刷しない理由を理解しようとしています。 ?

56
user737079

要するにスライス表記:

[ <first element to include> : <first element to exclude> : <step> ]

リストを反転するときに最初の要素を含める場合は、次のように中央の要素を空のままにします。

foo[::-1]

Python一般的なスライスについての良い情報もここにあります:
Pythonのスライス表記を説明する

106
Andrew Clark

スライス表記を思い出せない場合は、 Hokey Cokey を試してみてください。

[InOutShake it all about about]

[最初の要素in clude:残す最初の要素outstep使用する]

YMMV

8
Captain Lepton

...なぜfoo [6:0:-1]はリスト全体を印刷しないのですか?

中間値は包括的ではなく、exclusiveの停止値であるためです。 間隔表記 は[開始、停止)です。

これはまさに[x] rangeの仕組みです:

>>> range(6, 0, -1)
[6, 5, 4, 3, 2, 1]

これらは結果のリストに含まれるインデックスであり、最初のアイテムには0は含まれません。

>>> range(6, -1, -1)
[6, 5, 4, 3, 2, 1, 0]

別の見方は次のとおりです。

>>> L = ['red', 'white', 'blue', 1, 2, 3]
>>> L[0:6:1]
['red', 'white', 'blue', 1, 2, 3]
>>> len(L)
6
>>> L[5]
3
>>> L[6]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

インデックス6は、Lの有効なインデックス(正確には1つ前)を超えているため、除外されるストップ値として範囲から除外されます。

>>> range(0, 6, 1)
[0, 1, 2, 3, 4, 5]

リスト内の各アイテムのインデックスを引き続き提供します。

6
Fred Nurk

この答えは少し時代遅れかもしれませんが、同じ問題で立ち往生している人にとっては役に立つかもしれません。次のように2番目のインプレーススライスを適用して、インデックスが0までの任意の終わりの逆リストを取得できます。

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

つかいます

>>>foo[::-1]

これは、リストの最後の要素から最初までの逆を表示します。

1
Ashmita Dutta