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

时间:2016-03-12 10:11:27

标签: python python-3.x slice

是的,我知道那里有很多类似的问题。但我找不到我想要的东西。

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

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

现在我发现结果将是

[5, 'number']

所以我想也许我会通过更改字符串切片中的结尾来测试它。

print(my_jumble[:2:-1])

我确信Python会给我一些类似

的东西
[5, 'number', 'wumbly']
相反,它给了我这个让我完全失去的......

[5]

有人可以解释这里发生了什么吗?我是Python的新手,发现这非常令人困惑。感谢您的帮助。

4 个答案:

答案 0 :(得分:7)

我认为了解代码内容的最简单方法之一就是了解向后切片会反转您对列表进行索引的方式 visual ,它是喜欢反转你的列表)切片之前 列表中元素的索引不会更改。

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

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

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

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

然后当你从“开始”切换到一个(:1)时,你从“开始”(现在“开始”是3)获得所有内容,并在看到{{ 1}}:

1

因此你获得了回报:

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

使用[5, 'number'] 向后切片时,同样的原则适用:

[:2:-1]

因此你得到了你的结果:

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

现在,使用这个原则,如果你想要返回你想要的东西,你知道要放什么作为第二个索引器:零! - &gt; [5]

[:0:-1]

然后,您将获得所需的结果:

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

答案 1 :(得分:1)

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

如果您没有为start甚至零输入值,则python会决定合适的开始。对于正步骤,它将是0,对于负步骤,它将是最后一个元素。

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

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

由于你给stop一个正值,它将是从左到右的方向,因此你的情况下第三个元素的顺序正确。

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

答案 2 :(得分:1)

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

所以['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'

答案 3 :(得分:0)

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

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

即便如此:

print(my_jumble[:0:-1])

我认为你相信当你以-1为单位时,列表就会反转。您会看到第一个数字表示起始位置,第二个数字表示当前列表中的结束位置(您想要的切片),而不是反转列表。请参阅this.