我知道有很多切片表示法的问题,但我认为这应该有效,但事实并非如此。假设我们有:
a = [1, 2, 3, 4]
假设我们想将子数组从索引0反转为1:
a = a[1:-1:-1] + a[2:]
我希望得到a=[2, 1, 3, 4]
,但我得到的是a = [3, 4]
为什么?为什么a[1:-1:-1]
不返回[2, 1]
?我是不是错过了什么?
以下是您的代码正在执行的操作:
您有一个列表a=[1,2,3,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,1,3,4]
当使用负步长(例如list_[a, b, -n]
(进行切片时,a
将是要开始的包含索引,b
将是要向上移动的索引,而不包括它(因此是独占的(,同时向左执行大小为n
的步长。这就是切片在负步骤中的工作方式。
试试这个:
a = [1, 2, 3, 4]
a = a[1::-1] + a[2:]
print(a)
# Out: [2, 1, 3, 4]
注意:如果切片为a[1:0:-1]
,则由于切片规则,索引为零的元素不包括在内。因此,您必须省略该索引,以告诉python继续包含元素,直到用完元素为止。
如果这种切片让你感到困惑,更简单的方法是:
a = a[:2][::-1] + a[2:] # take normal slice first, then reverse it
编辑:您的a[1:-1:-1]
逻辑有缺陷,因为-1是列表最后一个元素的索引(存在负索引。