简单 Python 字符串(向后)切片

Simple Python String (Backward) Slicing

是的,我知道上面有很多类似的问题。但是我就是找不到我要找的东西。

我的困惑是关于向后切片。

my_jumble = ['jumbly', 'wumbly', 'number', 5]
print(my_jumble[:1:-1])

现在我发现结果会是

[5, 'number']

所以我想也许我会通过改变字符串切片的末端来测试它。

print(my_jumble[:2:-1])

我真的确定 Python 会给我类似

的东西
[5, 'number', 'wumbly']

相反,它给了我这个让我完全迷失的...

[5]

谁能解释一下这是怎么回事?我是 Python 的新手,发现这很令人困惑。感谢您的帮助。

@HarryLens 要做你真正想做的事,你必须这样做。

print(my_jumble[-1:0:-1])

即使这样也可以:

print(my_jumble[:0:-1])

我想你相信当你跨过一个-1时,列表是相反的。您会看到第一个数字代表当前列表中的起始位置,第二个数字代表结束位置(您想要的切片),而不是反向列表。参考 this.

我认为了解代码中发生的事情的最简单方法之一是了解向后切片反转索引列表的方式(视觉上,它是 like 反转你的列表)before 得到切片 but 的索引列表中的元素本身不会改变。

因此当你有这样一个列表时:

['jumbly', 'wumbly', 'number', 5]
    0        1         2       3   #<-- index

通过向后读取(添加 -1 作为第三个索引器),您可以使它 看起来 像这样(因为它现在是从最后一个索引到首先,而不是从第一个到最后一个):

[5, 'number', 'wumbly', 'jumbly']
 3      2         1       0       #<-- index

然后当你从 "beginning" 切为一个 (:1) 时,你会从 "beginning" 得到所有东西(现在 "beginning" 是 3) 并在看到 1:

时停止
[5, 'number', 'wumbly', 'jumbly']
 3      2         1       0       #<-- index
 ^      ^         x
 grab! grab!      nope!

因此你得到了你的 return:

[5, 'number']

当你用 [:2:-1]:

向后切片时,同样的原则适用
[5, 'number', 'wumbly', 'jumbly']
 3      2         1       0       #<-- index
 ^      x
 grab!  nope!

因此你得到了结果:

[5]

现在,使用该原则,如果您想要 return 您想要什么,您知道将什么作为第二个索引器:zero! --> [:0:-1]:

[5, 'number', 'wumbly', 'jumbly']
 3      2         1       0       #<-- index
 ^      ^         ^       x
 grab!  grab!     grab!   nope!

那么,你会得到你想要的结果:

[5, 'number', 'wumbly']

您使用的语法是 list[start:stop:step]

如果您不输入 start 的值,甚至不为零,那么 python 决定一个合适的开始。正步为 0,负步为最后一个元素。

因此在第一个示例中,您实际上是在说选择从 01 的所有项目,但顺序相反。所以它打印出 [5,'number']

在你的第二个例子中,你所说的是选择所有项目,从第一个开始,直到第三个,以相反的顺序。所以按照相反的顺序,你从 5 开始,你列表中的第三个项目是 'number',但是因为你只说到第三个,它就停在那里。

由于您为 stop 指定了一个正值,它将是从左到右的方向,因此在您的情况下第三个元素的顺序是正确的。

另请注意,在python中,list[start: stop]等同于[start: stop),考虑第一个元素,不包括右边界。

array[start:end:step] 表示从索引 start 开始,然后在每个循环周期中添加 step 并在索引变得大于或等于 end 时中断循环.如果省略 start,则等于 0。如果省略 end,则设置为 len(array)。如果 startend 为负数,则设置为 len(array) + startlen(array) + end。如果 step 为负,则在每个循环周期将其添加到当前索引,但是当 step 为正时,继续循环的条件是 current_index > end,而不是 current_index < end

所以 ['jumbly', 'wumbly', 'number', 5][:1:-1] 的意思是开始从索引 len(array) 到索引 1 的元素(不包括)——所以我们得到了项目 ['number', 5]:

>>> ['jumbly', 'wumbly', 'number', 5][:1:-1]
>>> [5, 'number']

['jumbly', 'wumbly', 'number', 5][:2:-1]表示从索引len(array)开始取元素到索引2(值'number'存储在索引2的列表中)(不包括)- - 所以我们有 [5]:

>>> ['jumbly', 'wumbly', 'number', 5][:2:-1]
>>> [5]

或者用一个以字符为索引的字符串来更好地解释:

>>> '0123'[:1:-1]
>>> '32'

>>> '0123'[:2:-1]
>>> '3'