他のいくつかの反復可能なオブジェクトからの要素を(それらを圧縮するのではなく)インターリーブできる関数がないことに気付きました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))