在Python中,可以使用数组切片表示法来获取可迭代的值的子集:
a = [0,1,2]
a[0:2]
# returns all members from the 0th to the 2nd: [0,1]
如果您尝试提取第一个值为负的切片,而第二个值为正,则请求返回一个空列表:
a[-1:2]
# returns []
这对我来说是违反直觉的,因为-1:2定义的范围似乎是由0:2定义的范围的超集。
我知道可以使用负片索从Python切片表示法中取出数组的末尾(例如:a[-1]
是2),但它看起来像第一个切片位置的负值而且是正值第二个应该引发错误或返回由同一切片返回的值的超集,其中第一个位置为0。
我很想知道切片请求返回的空列表背后的动机,在第一个位置有负值,如果有人碰巧在这个方面有洞察力,那么在第二个位置有正值......
答案 0 :(得分:9)
负指数对于获取最后一个元素非常有用:
>>> letters = list('abcdefgh')
>>> letters[-3:]
['f', 'g', 'h']
>>> letters[-3:-1]
['f', 'g']
在这种情况下过早提出异常将是一个巨大的错误。
您还可以混合使用正面和正面指数:
>>> letters[-5:6]
['d', 'e', 'f']
这意味着在第5个最后一个元素之后和第6个元素之前的元素。
在你的情况下:
>>> letters[-1:2]
[]
返回一个空列表,因为最后一个和第二个之间没有元素。
但它并不总是空的:
>>> ['a'][-1:2]
['a']
>>> ['a','b'][-1:2]
['b']
答案 1 :(得分:3)
我认为这只是一个误解:负值被解释为“从最后开始计算”,因此[-1:2]
不是[0:2]
的超集。反过来了!因为无论-1
是什么(实际值取决于可迭代的长度),它总是>= 0
。
在你的情况下,你有一个长度为3的数组,所以-1
被解释为2
,你想得到2到2之间的项目(停止独占),所以你得到一个空列表。
答案 2 :(得分:2)
假设您想要最后10个元素的切片。使用a[-10:]
可以轻松完成此操作。如果这会引发错误,那么你会写一些令人不快的东西,如a[len(a)-10:]
。更糟糕的是,如果a
不是具有您之前使用的列表的变量,而是您现在计算的内容,则需要创建一个新变量,以便有可能获取长度。如果你最后可以写[-10:]
,那就没有了。
显然,当这不是预期的行为时,这可能会有缺点,但为了在其他情况下的简洁性,这可能是值得的。