Estoy escribiendo un función de recorrido de árbol primero en profundidad
anchura, y lo que yo quiero hacer es esto:
Idiomatic Python: Propagación de los rendimientos o las secuencias de aplanamiento?
def traverse(node):
yield node
for n in node.children:
yield_all traverse(n) # << if Python had a yield_all statement
La idea es terminar con una secuencia (plana) de nodos en el árbol .
Enfoque # 1: (rendimientos que se propagan)
def traverse(node):
yield node
for n in node.children:
for m in traverse(n):
yield m
Enfoque # 2: (secuencias de aplanamiento)
def traverse(node):
return itertools.chain([node],*(traverse(n) for n in node.children))
El primer enfoque parece más limpio, pero me siento raro explícitamente yield
ing cada nodo en el subárbol en cada nivel.
El segundo enfoque es terso y un poco sucio, pero coincide con lo que iba a escribir en Haskell:
traverse node = node : concatMap traverse (children node)
Así que mi pregunta es: ¿Qué es mejor? ¿O me estoy perdiendo una mejor tercera opción?
listas por comprensión haría que este limpio. –
Rafe: ¡Escribe una respuesta y muéstrame! :-) – perimosocordiae
Me gustaría ver una lista de comprensión para esto ... tendrías que aplanarlo al final, ¿verdad? En lo que a mí respecta, la solución 'chain' es maravillosa. – delnan