Ho una sequenza di generatori: (gen_0, gen_1, ... gen_n)Attraversando una sequenza di generatori
Questi generatori creeranno i valori pigramente ma sono limitate e avranno lunghezze potenzialmente diversi.
Devo essere in grado di costruire un altro generatore che produce il primo elemento di ciascun generatore in ordine, seguito dal secondo e così via, saltando i valori dai generatori che sono stati esauriti.
Credo che questo problema è analogo a prendere tupla
((1, 4, 7, 10, 13, 16), (2, 5, 8, 11, 14), (3, 6, 9, 12, 15, 17, 18))
e attraversa in modo che dovesse produrre i numeri da 1 a 18 in ordine.
Sto lavorando alla risoluzione di questo semplice esempio utilizzando (genA, genB, genC) con valori di resa genA da (1, 4, 7, 10, 13, 16), generazione di genB (2, 5, 8, 11 , 14) e resa genC (3, 6, 9, 12, 15, 17, 18).
Per risolvere il problema più semplice con la tupla di tuple, la risposta è abbastanza semplice se gli elementi della tupla hanno la stessa lunghezza. Se la variabile 'a' di cui la tupla, è possibile utilizzare
[i for t in zip(*a) for i in t]
Purtroppo le voci non sono necessariamente la stessa lunghezza e il trucco zip non sembra funzionare per i generatori comunque.
Finora il mio codice è orribilmente brutto e non riesco a trovare nulla che si avvicini ad una soluzione pulita. Aiuto?
'itertools.izip_longest'; puoi passare una sentinella a tamponare i generatori che si esauriscono. Se lo desideri, puoi filtrare quel sentinella dai risultati. – katrielalex