python是否具有用于交织生成器/序列的内置函数?

Mar*_*cin 13 python functional-programming python-itertools

我注意到itertools(在我看来)没有一个函数能够交错来自其他几个可迭代对象的元素(而不是压缩它们):

def leaf(*args): return (it.next() for it in cycle(imap(chain,args)))
tuple(leaf(['Johann', 'Sebastian', 'Bach'], repeat(' '))) => ('Johann', ' ', 'Sebastian', ' ', 'Bach', ' ')
Run Code Online (Sandbox Code Playgroud)

(编辑)我问的原因是因为我想避免不必要的拉链/展平事件.

显然,定义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))
Run Code Online (Sandbox Code Playgroud)

phi*_*hag 11

您正在寻找的内置zipitertools.chain.from_iterable扁平化的结果:

>>> import itertools
>>> list(zip(['Johann', 'Sebastian', 'Bach'], itertools.repeat(' ')))
[('Johann', ' '), ('Sebastian', ' '), ('Bach', ' ')]
>>> list(itertools.chain.from_iterable(_))
['Johann', ' ', 'Sebastian', ' ', 'Bach', ' ']
Run Code Online (Sandbox Code Playgroud)

请注意,我list只是用来强制输出.使用标准的itertools,替代实现leaf将是:

leaf = lambda *a: itertools.chain.from_iterable(itertools.izip(*a)) # Python 2.x
leaf = lambda *a: itertools.chain.from_iterable(zip(*a))            # Python 3.x
Run Code Online (Sandbox Code Playgroud)

  • @Marcin拉链然后扁平化你有什么问题? (2认同)
  • 为@Marcin发言时,请想象输入的可迭代项是巨大的还是无限的,他可能宁愿迭代地处理它们,而不是一次全部处理它们。 (2认同)

Mat*_*ngo 5

itertools roundrobin()配方将是我的第一选择,尽管在你的确切示例中它将产生无限序列,因为它以最长的可迭代而不是最短的顺序停止.当然,解决这个问题很容易.也许值得检查一下不同的方法?