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

python是否有用于交错生成器/序列的内置函数?,python,functional-programming,itertools,Python,Functional Programming,Itertools,我注意到,itertools没有(在我看来)能够将来自其他几个iterable对象的元素交错(而不是压缩它们)的功能: (编辑)我询问的原因是我希望避免不必要的压缩/展平事件 显然,leaf的定义非常简单,但是如果有一个预定义的函数做同样的事情,我更愿意使用它,或者使用一个非常清晰的生成器表达式在itertools或其他一些著名的库中是否有内置的函数,或合适的惯用表达式? 编辑2:可以使用更简洁的定义(使用功能性包): 您正在寻找内置的,并将结果展平: >>> import i

我注意到,
itertools
没有(在我看来)能够将来自其他几个iterable对象的元素交错(而不是压缩它们)的功能:

(编辑)我询问的原因是我希望避免不必要的压缩/展平事件

显然,
leaf
的定义非常简单,但是如果有一个预定义的函数做同样的事情,我更愿意使用它,或者使用一个非常清晰的生成器表达式在itertools或其他一些著名的库中是否有内置的函数,或合适的惯用表达式?

编辑2:可以使用更简洁的定义(使用
功能性
包):


您正在寻找内置的,并将结果展平:

>>> import itertools
>>> list(zip(['Johann', 'Sebastian', 'Bach'], itertools.repeat(' ')))
[('Johann', ' '), ('Sebastian', ' '), ('Bach', ' ')]
>>> list(itertools.chain.from_iterable(_))
['Johann', ' ', 'Sebastian', ' ', 'Bach', ' ']
请注意,我使用
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

itertools是我的第一选择,尽管在你的例子中,它会产生一个无限序列,因为它以最长的iterable而不是最短的iterable停止。当然,解决这个问题很容易。也许值得一试不同的方法?

@larsmans以什么方式更安全
itertools.izip
从3.0.0版开始从Python中删除。我仍然主要生活在Python2.x世界中。对,但这仍然引入了一个拉链,然后将拉链对展平。我的全部动机(我应该说)是避免这样做。@Marcin你拉拉链然后压扁有什么问题吗?代表@Marcin,想象一下,输入的可比性是巨大的或无限的,他可能更愿意迭代地处理它们,而不是一次全部处理。在一个完全不相关的注释中,我忍不住提到所讨论的巴赫是约翰,不是约翰。@9000:没错——这是我在单元测试中心不在焉地写的,因为这是我一直在想的事情,除了(a)我更喜欢叶子语义(b)我的定义更简洁。
>>> import itertools
>>> list(zip(['Johann', 'Sebastian', 'Bach'], itertools.repeat(' ')))
[('Johann', ' '), ('Sebastian', ' '), ('Bach', ' ')]
>>> list(itertools.chain.from_iterable(_))
['Johann', ' ', 'Sebastian', ' ', 'Bach', ' ']
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