问题描述
在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。
我很想知道切片请求返回的空列表背后的动机,如果有人碰巧对此方面有见识,则该请求的第一个位置为负值,第二个位置为正值...
1楼
负索引对于获取最后一个元素非常有用:
>>> 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']
2楼
我认为这只是一个误解:负值被解释为“从头算起”,因此[-1:2]
并不是[0:2]
的超集。
反过来!
因为-1
是什么(实际值取决于可迭代的长度),所以它始终>= 0
。
在您的情况下,您有一个长度为3的数组,因此-1
被解释为2
并且您希望获得2到2之间的项目(停止排他),因此您将获得一个空列表。
3楼
假设您想要最后10个元素的一部分。
这可以通过a[-10:]
轻松完成。
如果那会引发错误,您将编写不愉快的内容,例如a[len(a)-10:]
。
甚至更糟a
是,如果a
不是一个以前使用过的列表所包含的变量,而是您现在所计算的内容,则您需要创建一个新的变量,以使长度变长。
而且,如果只能在末尾写[-10:]
,那么您就没有。
显然,当这不是预期的行为时,这可能会有缺点,但是为了简洁起见,在其他情况下,这可能是值得的。