使用Python中的切片[:0:-1]反转列表

2024-05-15 20:36:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我对Python中的列表切片感到困惑。

一份清单

L=[0,1,2,3,4,5,6,7,8,9,10]

我想把名单倒过来

L[::-1] 

正在获取[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

但是,当我试着

L[10:0:-1]

我得到的[10,9,8,7,6,5,4,3,2,1]没有0。 无论是L[10:1:-1]还是L[10:-1:-1]都没有给出答案。

另一方面,L[200::-1]L[10:-12:-1] 给出了正确的答案,尽管L[200]L[-12]超出了界限。

我想了解Python的底层逻辑 为了这个案子。 谢谢您。


Tags: 答案列表切片逻辑底层名单案子界限
3条回答
 >>> L = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
 >>> L[1:3]
 [1, 2]

索引3不包括

>>> L[0:10:1]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

索引10不包括,如果要全选,应使用:

>>>L[0:11:1]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

但是你不能得到L[11],它会抛出IndexError,因为你只有11个元素,最大索引是10,所以L[0:11:1]不会超出绑定范围,因为这个切片只从索引0到10访问L[11]

>>> L[10:0:-1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

-1是切片反转的一步,同时0也排除了

L[10:-1:-1]相当于L[10:10:-1],因为第一个-1表示

>>> L[10:-12:-1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

索引-11相当于索引0,索引-12相当于0之前的索引

对于Python列表切片语法,list[start:end:step]将获得以list[start]开头的项目的切片列表,但是list[end]被排除在外。因此,在您的情况下,L[10:0:-1]将排除L[0]、0和L[10::-1]将按您的预期工作。

startend是负数时,这意味着它从列表的末尾开始计数。因此list[-1]将获得列表中的最后一项。在您的例子中,L[10:-1:-1]等同于L[10:10:-1]。所以L[10:-1:-1]将得到[]

举个例子

a = [1, 2, 3, 4, 4, 5, 6, 9]

如果你试着用正指数分割它

newa = a[1:5] 

这将导致

newa = [2, 3, 4, 4] 

这是因为,在上面这种情况下,切片是这样发生的,[包含:排他的],包括第一个索引,切片从这个索引开始,只在索引(5)前面结束一个索引,排他的(记住)。这就是列表切片的工作方式。

要得到列表a的最后两个值

newa = [6 : ]

这里,索引从6开始(包括6),一直到列表的末尾。

如果您热衷于在列表中使用负索引(如Python提供的那样)来简化索引,那么请一劳永逸地了解有关切片的包含性和独占性内容。

对于上面的相同示例,要使用负索引获取列表的最后两个数字,我们要做的是

newa = a[-2 : ]

在正索引的情况下,索引从0开始,而对于负索引,索引在-1,-2处,依此类推。所以在上面的例子中,从列表的倒数第二开始,切片到列表的末尾,这就是我们所理解的。

现在,你可以把清单倒过来

print a.reverse()
[9, 6, 5, 4, 4, 3, 2, 1]

以切片的方式,列表可以通过给它一个如上所述的[开始,结束,步骤]来反转,但我想进一步澄清它。

 r = a[2: : -1]

这将生成一个新的列表,从索引2的数字开始,一直到列表的末尾,但是由于步骤是-1,我们将从索引2减少,直到达到0。因此,我们给出了前三个数字的相反列表,如下所示:

r = [3, 2, 1]

另外,要想把整个名单颠倒过来

r = a[len(a): : -1]

这将从列表的长度8开始,但是从0开始,我们有0到8个索引,所以从第8个索引开始,它将以-1的顺序递减,直到列表的末尾。结果是:

[9, 6, 5, 4, 4, 3, 2, 1]

我个人更喜欢用这个来颠倒列表。

相关问题 更多 >