【发布时间】:2011-02-13 21:26:49
【问题描述】:
假设我有一个包含以下字段的对象列表
父母
价值
这定义了一个树结构,类似于目录树。
我想以预订方式遍历列表。最有效的方法是什么?
通常,在其他(更重要的)语言中,我会迭代这些值,找到没有父对象的值,然后为每个对象再次迭代其父对象是我当前正在查看的对象的每个对象,依此类推,但是有没有更聪明的方法在 Python 中做到这一点?
【问题讨论】:
假设我有一个包含以下字段的对象列表
父母
价值
这定义了一个树结构,类似于目录树。
我想以预订方式遍历列表。最有效的方法是什么?
通常,在其他(更重要的)语言中,我会迭代这些值,找到没有父对象的值,然后为每个对象再次迭代其父对象是我当前正在查看的对象的每个对象,依此类推,但是有没有更聪明的方法在 Python 中做到这一点?
【问题讨论】:
我会首先创建一个更合适的数据结构——捕获从父级到子级的链接:
children = {}
for obj in tree:
children.setdefault(obj.parent, []).append(obj)
def preorder(root, children):
yield root.value
for child in children.get(root, []):
for value in preorder(child, children):
yield value
for root in children[None]:
for value in preorder(root, children):
print value
你也可以在这里使用collections.defaultdict。
【讨论】:
obj.parent is not None 在遍历中会更好。它的代码更少,速度更快,并且可以处理森林而不是树(children[None] 是所有树根的列表)。