关于python:以负步幅进入序列开头的扩展切片

Extended slice that goes to beginning of sequence with negative stride

当我解释我的问题时,请忍受。如果已经了解扩展切片列表索引,请跳到粗体标题。

在Python中,可以使用切片表示法对列表进行索引。下面是一个例子:

1
2
3
>>> A = list(range(10))
>>> A[0:5]
[0, 1, 2, 3, 4]

您还可以包括一个步幅,其作用类似于一个"步骤":

1
2
>>> A[0:5:2]
[0, 2, 4]

步幅也可以是负数,这意味着元素的检索顺序是相反的:

1
2
>>> A[5:0:-1]
[5, 4, 3, 2, 1]

但是等等!我想去看埃多克斯。哦,我明白了,我需要减少开始和结束指数:

1
2
>>> A[4:-1:-1]
[]

发生什么事了?它将-1解释为在数组的末尾,而不是开始。我知道你可以做到以下几点:

1
2
>>> A[4::-1]
[4, 3, 2, 1, 0]

但你不能在任何情况下都使用它。例如,在已传递索引的方法中。

我的问题是:

有没有什么好的Python式的方法可以使用带有负步幅的扩展切片,以及包含序列第一个元素的明确的开始和结束索引?

这是我到目前为止想出来的,但似乎不令人满意。

1
2
>>> A[0:5][::-1]
[4, 3, 2, 1, 0]

它是易错的、语义的变化,startstop)。使用None-(len(a) + 1)0-1代替。不是一个的语义。Edsger Dijkstra的国有企业。"为什么要在文章的起始编号为零。"

1
2
>>> a = range(10)
>>> start, stop, step = 4, None, -1

1
2
3
>>> start, stop, step = 4, -(len(a) + 1), -1
>>> a[start:stop:step]
[4, 3, 2, 1, 0]

1
2
3
>>> s = slice(start, stop, step)
>>> a[s]
[4, 3, 2, 1, 0]

s是负指数序列的处理:特别是在s[i:j:k]

If i or j is negative, the index is relative to the end of the string:
len(s) + i or len(s) + j is substituted. But note that -0 is still 0.

这是为什么,因为它是到range(10)[4:9:-1]len(range(10)[4:-1:-1]) == 0等效。


1
[ A[b] for b in range(end,start,stride) ]

慢,但你可以使用负指数,所以这应该工作。

1
[ A[b] for b in range(9, -1, -1) ]

这是不是可以用一片,但我想我的解决方案是使用切片,反正如果得到的结果是不是优先。


好的,我认为这是可能的,我会得到它的好。感谢的是abgan火花型思维。这relies在事实上没有在层是处理它的参数,如果是失踪。任何人有什么好的?

1
2
def getReversedList(aList, end, start, step):
    return aList[end:start if start!=-1 else None:step]

编辑:检查是不是start==-10

这仍然是不理想的,因为你的行为clobbering通常为-1。它似乎是一个问题的两个定义:在什么是应该发生的。谁要带走,否则invocations WINS在寻找其他有效的数据。


你说的非常少的人完全了解一切,你可以用扩展的切片,所以除非你真的需要额外的性能,我是"明显的"方式:


rev_subset = reversed(data[start:stop])


But you can't use that if you are
storing your indices in variables for
example.

这是不满意吗?

1
2
3
4
5
>>> a = range(10)
>>> start = 0
>>> end = 4
>>> a[4:start-1 if start > 0 else None:-1]
[4, 3, 2, 1, 0]

我相信你不是satisfy以下:

1
2
3
4
def getReversedList(aList, end, start, step):
    if step < 0 and start == 0:
         return aList[end::step]
    return aList[end:start:step]

或吗?:-)


你可以使用slice(start, stop, step)对象是这样的,这是

1
2
s=slice(start, stop, step)
print a[s]

的是相同的

1
print a[start : stop : step]

和,此外,你可以设置到任何的参数表明,在不到Nonecolons之间。所以在你的情况,你可以给slice(4, None, -1),使用。


我知道这是一个老问题,但有人喜欢我的情况是:寻找答案

1
2
3
4
5
>>> A[5-1::-1]
[4, 3, 2, 1, 0]

>>> A[4:1:-1]
[4, 3, 2]

1
a[4::-1]

例子:

1
2
3
4
5
6
7
8
9
10
11
Python 2.6 (r26:66714, Dec  4 2008, 11:34:15)
[GCC 4.0.1 (Apple Inc. build 5488)] on darwin
Type"help","copyright","credits" or"license" for more information.
>>> a = list(range(10))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[4:0:-1]
[4, 3, 2, 1]
>>> a[4::-1]
[4, 3, 2, 1, 0]
>>>

第二个原因是,长期的",而不是interpreted指数= =。离开它,是"在索引范围"。