Python社区  »  Python

python切片的奇怪行为

user3105173 • 4 天前 • 12 次点击  

假设我们有这个清单:

>>> 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 它的行为似乎也一样。

这是怎么回事?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/50763
 
12 次点击  
分享到微博
文章 [ 3 ]  |  最新文章 4 天前
sammy
Reply   •   1 楼
sammy    5 天前

这种行为在 documentation

从i到j的s切片定义为索引为k的项序列,这样i<=k<j。如果i或j大于len(s),则使用len(s)。如果省略或没有,请使用0。如果j被省略或没有,使用len(s)。如果i大于或等于j,则切片为空。

从i到j的s切片,步骤k。。。。到达j时停止(但不包括j)。当k为正时,如果i和j的值较大,则它们将减为len(s)。当k为负时,如果i和j的值较大,则它们将被减为len(s)-1。如果i或j被省略或没有,它们将成为结束值(哪个结束取决于k的符号)。

Jean-François Fabre
Reply   •   2 楼
Jean-François Fabre    5 天前

a[3:8:-1] 指示python从3开始,按-1的步骤转到8

这将创建一个空列表:通过添加 -1 (就像 list(range(3,8,-1)) 这也给出了一个空列表)

当你这样做的时候 a[:5:-1] 然后start是默认的start,python将其设置为“end of list”,这样它就“工作了”

和你一样 a[::-1] start&stop是默认的,python知道它们是从头到尾的(否则这个符号将不可用)

Carcigenicate
Reply   •   3 楼
Carcigenicate    5 天前

a[3:8:-1]

切片的开始和停止位置不会根据步骤进行调整。如果步骤为负,则从3开始倒转,但是没有索引在3到8之间的元素从3开始倒数,因此得到一个空列表。

您需要相应地设置开始和停止:

a[8:3:-1]

从8到4。