我对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的基本逻辑 对于这种情况。 谢谢。
答案 0 :(得分:4)
我们以列表为例,
a = [1, 2, 3, 4, 4, 5, 6, 9]
如果您尝试使用正数索引对其进行切片,
newa = a[1:5]
这将导致
newa = [2, 3, 4, 4]
这是因为,在上面的情况下,切片发生这样,包含[包含:独占],第一个索引,切片从这个索引开始,并在索引(5)之前只结束一个索引,独占(记住) 。这就是列表切片的工作方式。
获取列表a的最后两个值
newa = [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]
我个人更喜欢使用它来反转列表。
答案 1 :(得分:2)
对于Python列表切片语法,list[start:end:step]
将获得一个切片列表,其中的项目以list[start]
开头,但list[end]
被排除在外。因此,在您的情况下,L[10:0:-1]
将排除L[0]
,即。,0,L[10::-1]
将按预期运行。
当start
或end
为负数时,表示从列表末尾开始计算。因此list[-1]
将获取列表中的最后一项。在您的情况下,L[10:-1:-1]
相当于L[10:10:-1]
。因此L[10:-1:-1]
将获得[]
。
答案 2 :(得分:1)
>>> 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的最后一个索引
>>> L[10:-12:-1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
索引-11
等同于索引0
,索引-12
等同于0
之前的索引
答案 3 :(得分:1)
以上答案正确解释了使用列表切片时会发生什么。但是,我想谈谈问题的最后部分 - 即使200和12都超出数组范围,L[200::-1]
或L[10:-12:-1]
如何工作?
您可以通过这种方式简单地理解它 - 当切片用于从序列中提取元素时,python可确保切片中使用的索引在序列的长度内。因此,在您的情况下,当您指定L[200::-1]
时,内部发生的事情是Python检查序列L
的长度仅 11 ,因此将上述语句视为{ {1}}而是。类似的论点适用于L[10::-1]
。
This链接可以很好地了解切片。通常在本页末尾有一个描述和一个关于如何实现支持扩展切片的序列的示例。引用:
切片对象现在有一个方法 indices(length),给定了 序列的长度,返回可以的(开始,停止,步骤)元组 直接传递给range()。 indices()处理省略和 以与常规切片一致的方式进行越界索引 (而这个无害的短语隐藏着一堆令人困惑的细节!)。