迭代列表在Python中一次选择多个元素

时间:2017-06-26 18:05:21

标签: python list python-3.x iteration sequence

我有一个列表,我希望在其中迭代一定长度的切片,以尽可能大的数量相互重叠,例如:

>>> seq = 'ABCDEF'
>>> [''.join(x) for x in zip(seq, seq[1:], seq[2:])]
['ABC', 'BCD', 'CDE', 'DEF']

换句话说,是否有zip(seq, seq[1:], seq[2:])的简写,您可以在其中指定每个子序列的长度?

2 个答案:

答案 0 :(得分:4)

不是一个优雅的解决方案,但这有效:

seq = 'ABCDEF'
n=3
[seq[i:i+n] for i in range(0, len(seq)+1-n)]

答案 1 :(得分:1)

[seq[i:i+3] for i in range(len(seq)-2)]是类似的Python代码。

更优雅和推荐的版本是使用Python的itertools库(严重的是,为什么它们不只是在库中包含此函数?)。

在这种情况下,您可以使用与文档中提供的pairwise函数类似的内容。

from itertools import tee
def tripletWise(iterable):
    "s -> (s0,s1,s2), (s1,s2,s3), (s2,s3,s4), ..."
    a, b, c = tee(iterable, 3)
    next(b, None)
    next(c, None)
    next(c, None)
    return zip(a, b)

[''.join(i) for i in tripletWise('ABCDEF')]
> ['ABC', 'BCD', 'CDE', 'DEF']

您还可以创建一个更通用的功能,将列表分成多个要一次选择的元素。

def nWise(iterable, n=2):
    iterableList = tee(iterable, n)
    for i in range(len(iterableList)):
        for j in range(i):
            next(iterableList[i], None)
    return zip(*iterableList)

[''.join(i) for i in nWise('ABCDEF', 4)]
> ['ABCD', 'BCDE', 'CDEF']