我注意到它itertools
(在我看来)没有能够将来自其他几个可迭代对象的元素交错的功能(而不是压缩它们):
def leaf(*args): return (it.next() for it in cycle(imap(chain,args)))
tuple(leaf(['Johann', 'Sebastian', 'Bach'], repeat(' '))) => ('Johann', ' ', 'Sebastian', ' ', 'Bach', ' ')
(编辑)我问的原因是因为我想避免不必要的 zip/flatten 事件。
显然,定义leaf
很简单,但是如果有一个预定义的函数可以做同样的事情,我更愿意使用它,或者一个非常清晰的生成器表达式。是否有这样的内置函数,在 itertools 或其他一些著名的库中,或合适的惯用表达式?
编辑 2:一个更简洁的定义是可能的(使用functional
包):
from itertools import *
from functional import *
compose_mult = partial(reduce, compose)
leaf = compose_mult((partial(imap, next), cycle, partial(imap, chain), lambda *args: args))