zauważyłem, że itertools
nie robi (wydaje mi się) mają funkcję zdolną elementów przeplatania z kilkoma innymi iterowalny obiektów (w przeciwieństwie do kompresowania je):Czy python ma wbudowaną funkcję do przeplatania generatorów/sekwencji?
def leaf(*args): return (it.next() for it in cycle(imap(chain,args)))
tuple(leaf(['Johann', 'Sebastian', 'Bach'], repeat(' '))) => ('Johann', ' ', 'Sebastian', ' ', 'Bach', ' ')
(Edit) Pytam o to dlatego, Chcę uniknąć niepotrzebnych zip/flatten wystąpień.
Oczywiście, definicja leaf
jest dość prosta, ale jeśli istnieje predefiniowana funkcja, która robi to samo, wolałbym użyć tego lub bardzo przejrzystego wyrażenia generatora. Czy istnieje taka funkcja wbudowana w itertools lub w innej dobrze znanej bibliotece lub w odpowiednim idiomatycznym wyrażeniu?
Edit 2: Jeszcze bardziej zwięzła definicja jest możliwe (przy użyciu pakietu 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))
W całkowicie niepowiązanej notatce nie mogę nie wspomnieć, że wspomniany Bach był Johann, a nie John. – 9000
@ 9000: Całkiem - to wypadło z testu jednostkowego, w którym bezmyślnie napisałem go tak, jak jest – Marcin