21

所以我并没有真正理解切片中的步幅参数。
例如,"123456"[::-2]生产"642",但为什么"123456"[1::-2]生产"2""123456"[2::-2]生产"31"

4

5 回答 5

28

最简单的解释方法可能是解决您的示例:

"123456"[::-2]
# This takes the whole string ([::])
# Then it works backward (-)
# and it does every other character (2)

"123456"[1::-2]
# This is also working backward (-)
# every other character (2)
# but starting at position 1, which is the number 2.

"123456"[2::-2]
# Again, working backward (-)
# Every other character (2)
# begin at position 2, so you end up with positions 2, and 0, or '31'

切片语法是[<start>:<end>:step]. 如果<start>省略并且步骤为负,则它从字符串的末尾开始。

于 2011-10-14T16:39:43.170 回答
6

那是因为语法是string[start:end:step]

"123456"[::-2]

产生“642”,因为它将从最后一个字符开始。这是因为您没有提供切片将从哪个位置执行。所以它会从最后一个字符返回 2 个字符,直到到达第一个字符。

"123456"[1::-2]

产生“2”,因为您告诉 Python 从第二个字符(字符串中的索引 1)开始,并且您告诉 Python 从该位置后退 2 步。在这种情况下,Python 显然只会返回“2”。这是因为当 Python 尝试返回 2 步时,它已经只用了一步就命中了字符串中的第一个字符。

"123456"[2::-2]

您现在应该能够弄清楚这一点。但无论如何我都会解释一下。因此,您告诉 Python 从第三个字符(或索引 2)开始,然后从那里返回 2 步,直到它到达第一个字符。所以它会从“3”开始,然后后退两步,意外地到达了第一个字符——恰好是“1”。所以Python会给你“31”

于 2011-10-14T16:45:17.083 回答
5

请记住,索引从零开始。考虑到这一点,如果将字符串更改为'012345'

In [1]: '012345'[1::-2]
Out[1]: '1'

In [2]: '012345'[2::-2]
Out[2]: '20'

In [3]: '012345'[5::-2]
Out[3]: '531'

如您所见,切片确实从正确的索引开始,并且在每一步都采用正确的(负)步幅,直到到达字符串的开头。

于 2011-10-14T16:36:10.687 回答
0

当您使用 stride 时,它​​基本上有两个参数。(开始步幅的索引,步幅间隔)

"1234"[index::interval]

只要记住刺的索引从零开始,所以

"123456"[2::-2]

是说从索引 2 或“3”开始并在间隔内抓取每个。

"31"
于 2011-10-14T16:45:14.773 回答
0

让我们了解一下 python 语法中的切片:

string[starting index : ending index : step]

和你的第一个例子:

"123456"[::-2]

[::],不指定任何起始索引,它将采用整个字符串,123456

[::-2],值 -2 表示每 2 步从字符串末尾开始计数。

所以,你会得到 642。

于 2019-10-01T02:59:34.223 回答