Я пишу
ширину
глубину первого дерева функцию обхода, и то, что я хочу сделать это:Idiomatic Python: Распространение или выравнивание последовательностей?
def traverse(node):
yield node
for n in node.children:
yield_all traverse(n) # << if Python had a yield_all statement
Идея заключается в том, чтобы в конечном итоге с (плоской) последовательности узлов в дереве ,
Подход № 1: (распространяющиеся выходы)
def traverse(node):
yield node
for n in node.children:
for m in traverse(n):
yield m
подход # 2: (уплощение последовательности)
def traverse(node):
return itertools.chain([node],*(traverse(n) for n in node.children))
Первый подход кажется более чистым, но я чувствую себя странно, явно yield
ИНГ каждый узел в поддереве на каждом уровне.
Второй подход немногословен и немного грязный, но это соответствует тому, что я хотел бы написать в Haskell:
traverse node = node : concatMap traverse (children node)
Так что мой вопрос: Что лучше? Или я пропустил лучший третий вариант?
описаний списков сделают этот пылесос. –
Rafe: Напишите ответ и покажите мне! :-) – perimosocordiae
Я бы хотел, чтобы это было понято в списке ... вам нужно было сгладить его в конце, верно? Насколько мне известно, решение «цепочки» замечательно. – delnan