x = (1, 2, 3, 4)
ここでx[0:4:-1]
、空の を与えますtuple
()
。なぜこうなった?逆のタプルを与えるだけだと思った(4,3,2,1)
...
0 から始まり、4 より前で終わり、一度に -1 ずつ数えられるすべての値を求めています。それは価値がない。
やりたいことは、3 から開始し、-1 の前に終了し、一度に -1 ずつ数えることです。-1
ただし、「最後から 1 つ」を意味するため、そこに入れることはできません。したがって、次のように「3 から開始し、シーケンス全体を使い果たしたら終了し、一度に -1 ずつ数えます」と記述する必要があります。
x[3::-1]
または、より簡単に:
x[::-1]
スライスを明示的なループに変えると理解に役立つ場合があります。次のようになります。
def slicify(sequence, start, end, step):
if start < 0: start += len(sequence)
if end < 0: end += len(sequence)
result = []
while (start < end if step > 0 else start > end):
result.append(sequence[start])
start += step
return result
しかし、これは大まかに正しいだけです。正確な定義は、ドキュメントのSequence Typesの注 5 にあります。
s
fromi
toj
with stepのスライスは、次のようなk
インデックスを持つアイテムのシーケンスとして定義されます。つまり、インデックスは、、などであり、に達すると停止します (ただし、 は含まれません)。またはが より大きい場合は、を使用します。またはが省略された場合、それらは「終了」値になります (終了は の符号に依存します)。ゼロにすることはできません。の場合、のように扱われます。x = i + n*k
0 <= n < (j-i)/k
i
i+k
i+2*k
i+3*k
j
j
i
j
len(s)
len(s)
i
j
None
k
k
k
None
1
開始と終了を省略するか、開始と終了を逆にする必要があります。
x[::-1] # (4, 3, 2, 1)
x[3:0:-1] # (4, 3, 2)
x[3::-1] # (4, 3, 2, 1)
x[3:-5:-1] # (4, 3, 2, 1)
終点は含まれないため、3 つの要素[3:0:-1]
のみを使用してスライスすると返されます。最後の例では、負の値を使用してタプルの長さから減算し、エンドポイントになります。-1
負のストライドを使用すると、Python は逆方向にカウントすることを意味し、0 から開始すると 4 に到達することはありません。
Python のスライス構文はタプル以外にも適用されることに注意してください。文字列とリストはまったく同じ構文をサポートします。