扩展切片语法实际上对负步骤有什么作用?

时间:2013-01-25 07:14:15

标签: python list slice syntactic-sugar

python中的扩展切片语法已经向我解释为“a[n:m:k] returns every kth element from n to m”。

这让我很清楚当k为正时会发生什么。但我迷失在如何解释a[n:m:k]为负k。我知道a[::-1]会反转a,而a[::-k]会占用逆转a的第k个元素。

但这对k正定义的概括如何?我想知道a[n:m:k]是如何实际定义的,所以(例如)我可以理解为什么:

"abcd"[-1:0:-1] = "dcb"

a[n:m:-k]是否正在反转序列a,然后从n开始并在m之前结束一个原始索引的元素?我不这么认为,因为这种模式不适合我尝试过的其他n和m值。但是我无法弄清楚这是如何实际定义的,而且搜索让我无处可去。

2 个答案:

答案 0 :(得分:13)

[-1:0:-1]表示:从索引len(string)-1开始,向上移动到0(不包括在内),然后迈出-1(反向)步骤。

因此,提取了以下索引:

le-1, le-1-1, le-1-1-1  .... 1  # le is len(string)

示例:

In [24]: strs = 'foobar'

In [25]: le = len(strs)

In [26]: strs[-1:0:-1]  # the first -1 is equivalent to len(strs)-1

Out[26]: 'raboo'

In [27]: strs[le-1:0:-1]   
Out[27]: 'raboo'

答案 1 :(得分:9)

Python文档(here's the technical one; range()的解释更容易理解)比简化的“每个第k个元素”解释更正确。切片参数恰当地命名为

slice[start:stop:step]

所以切片从start定义的位置开始,在到达位置stop之前停止,并通过step项从一个位置移动到下一个位置。