我有一个列表,想要迭代一定长度的切片,让它们尽可能地重叠,例如:
>>> seq = 'ABCDEF'
>>> [''.join(x) for x in zip(seq, seq[1:], seq[2:])]
['ABC', 'BCD', 'CDE', 'DEF']
换句话说,是否有一种简写方式可以指定每个子序列的长度,而不是使用
zip(seq, seq[1:], seq[2:])
?我有一个列表,想要迭代一定长度的切片,让它们尽可能地重叠,例如:
>>> seq = 'ABCDEF'
>>> [''.join(x) for x in zip(seq, seq[1:], seq[2:])]
['ABC', 'BCD', 'CDE', 'DEF']
zip(seq, seq[1:], seq[2:])
?并不是一个优雅的解决方案,但这个方法可行:
seq = 'ABCDEF'
n=3
[seq[i:i+n] for i in range(0, len(seq)+1-n)]
[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']
grouper(<iter>,3)
进行操作。ichunked()
或chunked()
函数。
tripletWise
is wrong. It should returnzip(a, b, c)
- Ignacio