Python切片算法,结束行为

时间:2015-03-12 12:49:39

标签: python slice

我想以某种切片排列遍历列表:

l = range(10)
for i in (0,1,2):
    print l[i:i + 3]

# [0, 1, 2]
# [1, 2, 3]
# [2, 3, 4]

然而,当我尝试从列表的末尾开始,i = 0失败的情况

l = range(10)
for i in (0,1,2):
    print l[-(i + 3):-i]

# [] // expected: [7, 8, 9]
# [6, 7, 8]
# [5, 6, 7]

我理解为什么这不起作用。

l[-1:]
l[-1:None]

两者都有效但

l[-1:0]
由于引用第一个元素的0而不是“最后一个元素之后的元素”,

检索一个空集。

但是我想知道是否有一个解决方案可以实现一个简单的“从x到最终的迭代”,其中end不需要特别处理,以防我实际到达终点。

以上示例仅仅是示例,我尝试在NumPy中分配值,因此l[...].reverse()等不起作用。

3 个答案:

答案 0 :(得分:3)

您可以使用len(l) - i代替-i

l = range(10)
for i in (0,1,2):
    print l[-(i + 3):len(l) - i]

输出:

[7, 8, 9]
[6, 7, 8]
[5, 6, 7]

答案 1 :(得分:3)

一种方法是进行一些算术以避免使用负索引。

n = len(l)
for i in (0, 1, 2):
    j = n - 3 - i;
    print l[j: j + 3]

答案 2 :(得分:1)

您也可以使用步骤运算符并反转列表:

for i in (0,1,2):
    new_l = l[-1-i:-4-i:-1]
    new_l.reverse()
    print new_l