Python理解切片符号问题

问题描述

我知道有很多切片符号问题,但我认为这应该有效,但它没有。假设我们有:

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]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...