当我解释我的问题时,请耐心等待.如果您已经了解扩展切片列表索引,请跳至粗体标题.
在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]
但是你不能在所有情况下使用它.例如,在已传递索引的方法中.
是否有任何好的pythonic方法使用具有负步幅的扩展切片以及包含序列的第一个元素的显式开始和结束索引?
这是我到目前为止所提出的,但似乎并不令人满意.
>>> A[0:5][::-1] [4, 3, 2, 1, 0]
jfs.. 5
这是容易出错的改变的语义start
和stop
.使用None
或-(len(a) + 1)
代替0
或-1
.语义不是任意的.请参阅Edsger W. Dijkstra的文章"为什么编号应该从零开始".
>>> 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]
什么s
是序列时负特征索引s[i:j:k]
是专门处理的:
如果
i
或j
为负数,则索引相对于字符串的结尾:len(s) + i
或者len(s) + j
被替换.但请注意,这-0
仍然是0
.
这就是为什么len(range(10)[4:-1:-1]) == 0
因为它相当于range(10)[4:9:-1]
.
这是容易出错的改变的语义start
和stop
.使用None
或-(len(a) + 1)
代替0
或-1
.语义不是任意的.请参阅Edsger W. Dijkstra的文章"为什么编号应该从零开始".
>>> 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]
什么s
是序列时负特征索引s[i:j:k]
是专门处理的:
如果
i
或j
为负数,则索引相对于字符串的结尾:len(s) + i
或者len(s) + j
被替换.但请注意,这-0
仍然是0
.
这就是为什么len(range(10)[4:-1:-1]) == 0
因为它相当于range(10)[4:9:-1]
.