gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:30:28 26 4
gpt4 key购买 nike

我注意到 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))

最佳答案

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

>>> 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

关于python - python是否具有用于交错生成器/序列的内置函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8769829/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com