2011-08-28 41 views
1

我正在處理Python程序中的樹結構。 樹中的每個節點都有一個字典「sons」,其中的鍵包含弧信息,值爲 是兒子節點。問題是將節點列表傳播給他們的所有兒子。 我使用:如何在Python中傳播樹節點

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

哪裏current_nodes爲節點的初始(和更新的)名單。

我的程序花費大部分時間來執行這個減少操作。有更快的方法來實現嗎?

謝謝!

編輯: 嗨,只是讓你知道這些代碼: sum((node.sons.values() for node in current_nodes), []) 雖然Python的,是不是真的顯著快 - 如果節點 的名單很長(> 20000),傳播速度減慢不成比例,實際上, 非常慢。我不知道爲什麼。

然後我定義:

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

然後我用:current_node = Ext(current_node)。 這種方法實際上要快得多。在處理列表連接時,我猜sum()函數的效率不如列表的擴展方法。

+0

爲什麼你使用那個醜陋'減少'當'sum'做的工作?同樣的事情,那個醜陋的'地圖':'列表推導'FTW – JBernardo

+0

可以總結列表的列表? – justin

+1

我明白了。 sum([node.sons.values()爲current_nodes中的節點],[]) – justin

回答

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

應該更快。 mapreducelambda s很慢。我不知道chain有多快;你可以嘗試

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

以及。

+0

我以爲你正在休息;) –

+0

我每天登錄一次工作我的國旗重量,我碰巧看到這個:) – agf

+0

美麗。謝謝。 – justin