问题描述
我知道有很多切片符号问题,但我认为这应该有效,但它没有。假设我们有:
a = [1,2,3,4]
假设我们要将子数组从索引 0 反转为 1:
a = a[1:-1:-1] + a[2:]
我希望得到 a=[2,1,4]
但我得到的是 a = [3,4]
这是为什么?为什么 a[1:-1:-1]
不返回 [2,1]
?我错过了什么吗?
解决方法
当以负步(例如 list_[a,b,-n]
)切片时,a
将是开始的包含索引,b
将是不包含它的索引(因此排他)同时向左采取 n
大小的步长。这就是负步切片的工作原理。
试试这个:
a = [1,2,3,4]
a = a[1::-1] + a[2:]
print(a)
# Out: [2,1,4]
注意:如果切片为 a[1:0:-1]
,则由于切片规则,索引为零的元素不包括在内。因此,您必须省略该索引以告诉 python 继续包含元素,直到用完元素。
如果这种切片让您感到困惑,那么更简单的方法是:
a = a[:2][::-1] + a[2:] # take normal slice first,then reverse it
编辑:您的 a[1:-1:-1]
逻辑有缺陷,因为 -1 是列表最后一个元素的索引(存在负索引!),因此您不能使用数学并争论 -1 小于0 所以它应该可以工作。
这是您的代码正在执行的操作:
你有一个列表a=[1,4]
现在当你执行 a[1:-1:-1]
时,它会返回一个 []
。那是因为列表切片工作:[start index : end index : steps]
。任何 -1,-2
负运算符都表示从后面开始。当您执行 [1:-1:-1]
时,您是在告诉它从较低的位置和较高的位置向后移动。这就是为什么它会给你一个 []
空列表。
您真正想要的是 a[1::-1]
告诉从索引 1 向后到列表末尾 - 即 1 然后 0
而 a[2:]
表示从索引位置 2 到结尾。
因此a[1::-1]+a[2:]
会给你[2,4]