a='0123456789'
>>> a
'0123456789'
>>> a[1:-6:1] # working as expected
'123'
>>> a[2:-1:-1] # i was expecting '210' as answer based on start index=2 end index=0
''
请帮助理解第二个分片运算符如何不返回任何内容
答案 0 :(得分:7)
start
和stop
的负索引始终通过从len(sequence)
中隐式减去来转换。因此,a[2:-1:-1]
转换为a[2:len(a)-1:-1]
或a[2:9:-1]
,其英语读音为“从索引2开始,向后退1,直到等于或低于索引9”。>
由于您从索引2开始,因此您已经等于或低于9,并且分片立即结束。
如果要从索引切到字符串的开头,请省略结尾索引(对于负片,则意味着继续到“开始字符串”):
a[2::-1]
或将其显式提供为None
,这就是省略stop
隐式使用的结果:
a[2:None:-1]
答案 1 :(得分:4)
我认为,您想做这样的事情:
a[2::-1] # produces: [2, 1, 0]
使用步骤2
从-1
切成-1
(您所做的)确实会产生一个空列表,因为您想以负步长前进,因此会收到一个空列表
This SO post提供了解释:
这真的很简单:
a[start:end] # items start through end-1 a[start:] # items start through the rest of the array a[:end] # items from the beginning through end-1 a[:] # a copy of the whole array
还有步长值,可以与上述任何一个一起使用:
a[start:end:step] # start through not past end, by step
要记住的关键点是:end值代表第一个 不在所选切片中的值。所以,两端之间的区别 开始是所选元素的数量(如果步骤为1,则 默认)。
另一个功能是开始或结束可能是负数, 表示它从数组的末尾而不是开头开始计数。 所以:
a[-1] # last item in the array a[-2:] # last two items in the array a[:-2] # everything except the last two items
类似地,step可能是负数:
a[::-1] # all items in the array, reversed a[1::-1] # the first two items, reversed a[:-3:-1] # the last two items, reversed a[-3::-1] # everything except the last two items, reversed
如果项目少于您所要求的,Python对程序员很友好 对于。例如,如果您要求a [:-2]并且a仅包含一个 元素,您将获得一个空列表而不是一个错误。有时候你 会更喜欢该错误,因此您必须意识到可能会发生这种情况。
答案 2 :(得分:0)
您可以这样做:
a=[0,1,2,3,4,5,6,7,8,9]
print(a[2::-1])
因为当您在切片操作中执行-1
时(如您的代码中一样),python会将其假定为结束索引位置。
要证明这一点:
>>> a[-1]
9
您的代码格式:
a[start:end:step]
您的情况下的 start
应该为2
(包括),而end
应该为空白(不包括)。将step
指定为-1
时,将以相反的顺序进行切片。
答案 3 :(得分:0)
切片索引如下图所示。切片s[start:end]
是从start
开始并延伸到但不包括end
的元素。因此,使用-1
意味着不包括最后一个索引。因此,这按设计工作。如果需要最后一个索引,可以选择将其留空。
所以
s[1:]
返回ello s[1:-1]
返回ell 请参见Google Python Class - Strings,它启发了这个答案,也是我从这张照片中抓到的地方。
答案 4 :(得分:0)
负索引总是 解释为从头开始的索引。另一方面,None
总是被解释为“直到适当的目的”:
>>> a[2::-1]
'210'
缺少索引等于切片中的None
:
>>> a[2:None:-1]
'210'
要了解我的意思,请尝试
>>> a[:2:-1]
'9876543'