假设我们有以下列表:
>>> a = [x for x in range(10)]
>>> print(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
分别地,两种分割方法都可以按预期进行:
>>> a[3:8]
[3, 4, 5, 6, 7]
>>> a[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
但是,当结合使用时:
>>> a[3:8:-1]
[]
我希望它是[7, 6, 5 ,4, 3]
或[6, 5, 4, 3, 2]
(如果反转首先发生)。
考虑当未传递start
或stop
参数时会发生什么也很有趣:
>>> a[:5:-1]
[9, 8, 7, 6]
这几乎是我所期望的,只有短一点。用numpy
进行了测试,它的行为似乎与此相同。
这是怎么回事?
答案 0 :(得分:19)
使用
main
切片的开始和停止位置未根据步骤进行调整。负数表示您使它从3向后退,但是没有索引在3到8范围内的元素从3开始倒数,因此您得到一个空列表。
您需要相应地设置开始和停止位置:
f
从8倒数到4。
答案 1 :(得分:6)
a[3:8:-1]
指示python从3开始并以-1的步长升至8
这将创建一个空列表:通过添加-1
不可能从3达到8(就像list(range(3,8,-1))
也会给出一个空列表)
当您执行a[:5:-1]
时,start是默认的开始,python将其设置为“ list of end”以便它“起作用”
与执行a[::-1]
时一样,开始和停止是默认值,并且python理解它们是从头到尾的(否则该符号将不可用)
答案 2 :(得分:4)
此行为在documentation中进行了说明。
从i到j的s切片被定义为索引为k的项序列,使得i <= k
从i到j的s切片,步骤k ....到达j时停止(但不包括j)。当k为正时,如果i和j较大,则将它们减小为len。当k为负数时,如果i和j较大,则将它们减小为len-1。如果省略i或j或“无”,它们将成为“结束”值(该结束取决于k的符号)。