题
熊与我,而我解释一下我的问题。跳过了大胆的标题,如果你已经理解了扩展切片列表索引。
在Python,可以使用切片符号索引列表。下面是一个例子:
>>> A = list(range(10))
>>> A[0:5]
[0, 1, 2, 3, 4]
您还可以包括一个步幅,其作用就像是“步骤”:
>>> A[0:5:2]
[0, 2, 4]
在步幅也允许为负,这意味着元件以相反的顺序被检索:
>>> A[5:0:-1]
[5, 4, 3, 2, 1]
别急!我想看看[4, 3, 2, 1, 0]
。哦,我明白,我需要递减的开始和结束的索引:
>>> A[4:-1:-1]
[]
发生了什么?它解释-1为在阵列,而不是开始的结束。我知道你可以做到这一点,如下所示:
>>> A[4::-1]
[4, 3, 2, 1, 0]
但你不能在所有情况下使用。例如,这一直是通过指数的方法。
我的问题是:
是否有使用扩展片,用负的步幅任何好的Python的方式和明确的开始和结束索引包括一个序列的第一个元素
这是我想出到目前为止,但似乎未能如愿。
>>> A[0:5][::-1]
[4, 3, 2, 1, 0]
解决方案 2
好吧,我想这大概是一样好,我会得到它。由于Abgan的火花的想法。这依赖于就好像它是一个缺少的参数没有在片中被处理的事实。任何人有什么好?
def getReversedList(aList, end, start, step):
return aList[end:start if start!=-1 else None:step]
编辑:检查start==-1
,不0
这仍然不是很理想,因为你重挫-1的通常行为。看来这里的问题是什么应该发生的两个重叠的定义。无论谁赢得带走否则有效调用查找的其他意图。
其他提示
有容易出错改变start
和stop
的语义。使用None
或-(len(a) + 1)
代替0
或-1
。语义不是任意的。见艾兹赫尔·戴克斯特拉的文章“为什么要编号从零开始” 。
>>> a = range(10)
>>> start, stop, step = 4, None, -1
或者
>>> start, stop, step = 4, -(len(a) + 1), -1
>>> a[start:stop:step]
[4, 3, 2, 1, 0]
或者
>>> s = slice(start, stop, step)
>>> a[s]
[4, 3, 2, 1, 0]
如果
i
或j
是否定的,该索引是相对于所述字符串的末尾:len(s) + i
或len(s) + j
被取代。但是请注意,-0
仍然0
。
这就是为什么len(range(10)[4:-1:-1]) == 0
因为它相当于range(10)[4:9:-1]
。
[ A[b] for b in range(end,start,stride) ]
慢,但是你可以使用负的指数,所以这应该工作:
[ A[b] for b in range(9, -1, -1) ]
我知道这是不使用切片,但认为如果使用切片专门用于获取结果我反正提供解决方案是不是一个优先级。
我认为有以下不满足你:
def getReversedList(aList, end, start, step):
if step < 0 and start == 0:
return aList[end::step]
return aList[end:start:step]
或不是吗? : - )
但是你不能使用,如果你是 存储你在指标变量 示例
这是令人满意的?
>>> a = range(10)
>>> start = 0
>>> end = 4
>>> a[4:start-1 if start > 0 else None:-1]
[4, 3, 2, 1, 0]
至于你说的极少数人完全明白一切,你可以扩展切片做的,所以除非你真的需要额外的性能我做了“明显”的方式:
rev_subset = reversed(data[start:stop])
a[4::-1]
示例:
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]
>>>
原因在于,第二项被解释为“不同时索引==”。离开它是“而在范围索引”。
我知道这是一个老问题,但如果像我在寻找答案:
>>> A[5-1::-1]
[4, 3, 2, 1, 0]
>>> A[4:1:-1]
[4, 3, 2]
可以使用slice(start, stop, step)
对象,这是使得
s=slice(start, stop, step)
print a[s]
是相同的
print a[start : stop : step]
,此外,你可以设置任何参数None
,表示没有在冒号之间。所以,在你给的情况下,你可以使用slice(4, None, -1)
。