私はitertools
が(それは私には思える)他のいくつかの反復可能なオブジェクト(それらをビュンとは反対に)からインターリーブ要素のできる機能を持っていないことに気づいた:Pythonには、ジェネレータ/シーケンスをインターリーブするための組み込み関数がありますか?
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))
全く関係のない注記では、私は問題のバッハがジョンではなくヨハンであると言及しています。 – 9000
@ 9000:確かに、これは単なるテストではありませんでしたが、私はそのままそれを書きました – Marcin