如何在每次迭代中从列表中访问元素的“窗口”?

时间:2011-09-10 14:40:33

标签: python list

假设我有一个列表[a,b,c,d,e],我想创建一个元组列表[(a,b,c),(b,c,d),(c,d, E)]。是不是可以不使用数组索引作为我的循环变量?这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:1)

zip(li, li[1:],li[2:])

这将元素拉到一起。每次迭代对应li [i],li [i + 1],li [i + 2],因此解决了原始问题。

答案 1 :(得分:0)

不确定这是否满足您的约束,但它应该这样做。

the_list = [1,2,3,4,5,6,7]
tuple_size = 3
tuple_list = [tuple(the_list[i-tuple_size:i]) for i in range(tuple_size, len(the_list))]

答案 2 :(得分:0)

当我想要这样做时,我保留了这个方便的功能。

import itertools

def nwise(it, n, wrapping=False):
    # nwise('ABCD', 2) --> AB BC CD
    # nwise('ABCDEF', 3) --> ABC BCD CDE DEF
    # nwise('ABCD', 2, wrapping=True) --> AB BC CD DA
    # nwise('ABCD', 3, wrapping=True) --> ABC BCD CDA DAB
    copies = itertools.tee(it, n)
    columns = []
    for index, copy in enumerate(copies):
        front = list(itertools.islice(copy, 0, index))
        if wrapping:
            columns.append(itertools.chain(copy, front))
        else:
            columns.append(copy)
    return itertools.izip(*columns)