Python中迭代列表并选择多个元素

3

我有一个列表,想要迭代一定长度的切片,让它们尽可能地重叠,例如:

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

换句话说,是否有一种简写方式可以指定每个子序列的长度,而不是使用zip(seq, seq[1:], seq[2:])
3个回答

6

并不是一个优雅的解决方案,但这个方法可行:

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

2
"

[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']

1
tripletWise is wrong. It should return zip(a, b, c) - Ignacio

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接