切换vs Stride同时反转弦

时间:2012-05-28 17:19:33

标签: python

通常要反转列表,应该执行以下操作:

>>>>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]

3 个答案:

答案 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 objectObjects/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]