Je suis en train d'écrire une
largeur
profondeur première fonction traversal d'arbre, et ce que je veux faire est la suivante:Python idiomatique: Propagation des rendements ou des séquences d'aplatissement?
def traverse(node):
yield node
for n in node.children:
yield_all traverse(n) # << if Python had a yield_all statement
L'idée est de se retrouver avec une séquence (plat) de noeuds dans l'arbre .
Approche # 1: (se propageant à des rendements)
def traverse(node):
yield node
for n in node.children:
for m in traverse(n):
yield m
Approche # 2: (séquences aplanissement)
def traverse(node):
return itertools.chain([node],*(traverse(n) for n in node.children))
La première approche semble plus propre, mais je me sens bizarre explicitement yield
ing chaque noeud dans le sous-arbre à chaque niveau.
La deuxième approche est laconique et un peu sale, mais elle correspond à ce que j'écrire dans Haskell:
traverse node = node : concatMap traverse (children node)
Donc, ma question est: Quel est le meilleur? Ou est-ce que je manque une meilleure 3ème option?
Liste compréhensions ferait ce nettoyeur. –
Rafe: Ecrivez une réponse et montrez-moi! :-) – perimosocordiae
Je voudrais voir une liste de compréhension pour cela ... vous auriez besoin de l'aplatir à la fin, non? En ce qui me concerne, la solution «en chaîne» est merveilleuse. – delnan