通常要反转列表,应该执行以下操作:
>>>>l = [1, 2, 3, 4, 5]
>>>>l[::-1]
[5, 4, 3, 2, 1]
但不是这样的确切语法:
list[<start>:<end>:<stop>]
如果我没有给出可选参数,则默认值如下(如果我错了,请纠正我:
<start> = 0(Beginning of list)
<end> = 5(Length of list)
<step> = 1
因此,如果我给出可选参数,它实际上应该产生相同的结果:
>>>>l[0:5:-1]
>>>>[]
但我得到一个空列表(我知道为什么会发生这种情况),但是在第一种情况下python采用的默认值是什么?它应该取0和5作为默认值并且不产生任何效果,或者 [:: - 1] 与列表不同[start:end:stop]
答案 0 :(得分:4)
l[::-1]
相当于l[slice(None,None,-1)]
,其中slice([start], stop[, step])
返回slice个对象。
请考虑以下事项:
>>> slice(None,None,-1).indices(5)
(4, -1, -1)
>>> slice(None,None,1).indices(5)
(0, 5, 1)
这是您在使用扩展索引语法访问列表时看到的确切行为,即l[start:stop:step]
。
>>> l[::-1]
[5, 4, 3, 2, 1]
>>> l[slice(None,None,-1)]
[5, 4, 3, 2, 1]
...但是第一种情况下python采用的默认值是什么?
开始/停止(如果未提供)的值基于数字(如果索引(列表长度))以及step
的值。具体来说,请参阅CPython source for the slice object(Objects/sliceobject.c
)
if (r->start == Py_None) {
*start = *step < 0 ? length-1 : 0;
} else {
/* .... */
}
if (r->stop == Py_None) {
*stop = *step < 0 ? -1 : length;
} else {
/* .... */
}
答案 1 :(得分:2)
如果您的步骤是否比列表末尾的开头为负,则可以使用否定索引来执行此操作。
尝试:
l[-1:-6:-1]
答案 2 :(得分:0)
如果您向后走过列表,则启动和停止相反,请尝试以下操作:
l[5:0:-1]
有趣的是,它只对5个元素中的4个进行切片(因为“end”应该是结尾的一个),这不起作用:
l[5:-1:-1]
这可以满足您的需求:
l[5::-1]