我有一个列表,我希望在其中迭代一定长度的切片,以尽可能大的数量相互重叠,例如:
>>> seq = 'ABCDEF'
>>> [''.join(x) for x in zip(seq, seq[1:], seq[2:])]
['ABC', 'BCD', 'CDE', 'DEF']
换句话说,是否有zip(seq, seq[1:], seq[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']