如何在Python中传播树节点

时间:2011-08-28 03:06:06

标签: python tree reduce

我正在处理Python程序中的树结构。 树中的每个节点都有一个字典“sons”,其键包含弧形信息和值 是儿子节点。问题是将节点列表传播给他们所有的儿子。 我用:

current_nodes = reduce(lambda s,x:s+x, map(lambda node:node.sons.values(),current_nodes),[])

其中current_nodes是节点的初始(和更新)列表。

我的程序花费大部分时间执行此reduce操作。有没有更快的方法来实现它?

谢谢!

编辑: 嗨,只是让你知道代码: sum((node.sons.values() for node in current_nodes), []) 虽然pythonic,但实际上并没有明显更快 - 如果是节点列表 如果长(> 20000),传播会不成比例地减慢,实际上非常慢。我不知道为什么。

然后我定义:

def Ext(nodes)
    l=[]
    for node in nodes:
        l.extend(node.sons.values())
    return l

然后我使用:current_node = Ext(current_node)。 这种方法实际上要快得多。我想sum()函数在处理列表连接时不如列表的extend方法有效。

1 个答案:

答案 0 :(得分:4)

from itertools import chain
list(chain.from_iterable(node.sons.values() for node in current_nodes))

应该更快。 map上的reducelambda速度很慢。我不知道chain有多快;你可以尝试

sum((node.sons.values() for node in current_nodes), [])