Python理解切片表示法的问题



我知道有很多切片表示法的问题,但我认为这应该有效,但事实并非如此。假设我们有:

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是列表最后一个元素的索引(存在负索引。

最新更新