当前位置:  开发笔记 > 编程语言 > 正文

扩展切片,以负步幅进入序列的开头

如何解决《扩展切片,以负步幅进入序列的开头》经验,为你挑选了1个好方法。

当我解释我的问题时,请耐心等待.如果您已经了解扩展切片列表索引,请跳至粗体标题.

在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

这是容易出错的改变的语义startstop.使用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]是专门处理的:

如果ij为负数,则索引相对于字符串的结尾: len(s) + i或者len(s) + j被替换.但请注意,这-0仍然是0.

这就是为什么len(range(10)[4:-1:-1]) == 0因为它相当于range(10)[4:9:-1].



1> jfs..:

这是容易出错的改变的语义startstop.使用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]是专门处理的:

如果ij为负数,则索引相对于字符串的结尾: len(s) + i或者len(s) + j被替换.但请注意,这-0仍然是0.

这就是为什么len(range(10)[4:-1:-1]) == 0因为它相当于range(10)[4:9:-1].

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有