Sto scrivendo un funzione di attraversamento albero DF
ampiezza, e quello che voglio fare è questo:
Python idioma: propagazione dei rendimenti o sequenze di appiattimento?
def traverse(node):
yield node
for n in node.children:
yield_all traverse(n) # << if Python had a yield_all statement
L'idea è di finire con un (piatta) sequenza di nodi nell'albero .
Approccio # 1: (i rendimenti che si propagano)
def traverse(node):
yield node
for n in node.children:
for m in traverse(n):
yield m
Approccio # 2: (sequenze appiattimento)
def traverse(node):
return itertools.chain([node],*(traverse(n) for n in node.children))
Il primo approccio sembra più pulito, ma mi sento strano esplicitamente yield
ing ogni nodo nella sottostruttura di ogni livello.
Il secondo approccio è terso e un po 'sporca, ma corrisponde a ciò che avrei scritto in Haskell:
traverse node = node : concatMap traverse (children node)
Quindi la mia domanda è: quale è meglio? O mi manca una migliore terza opzione?
di lista renderebbe questo pulitore. –
Rafe: Scrivi una risposta e mostrami! :-) – perimosocordiae
Mi piacerebbe vedere una lista di comprensione per questo ... avresti bisogno di appiattirlo alla fine, giusto? Per quanto mi riguarda, la soluzione "chain" è meravigliosa. – delnan