2013-01-09 43 views
1

我想創建一個集合,其中包含由應用於集合中每個元素的函數返回的所有結果。下面的代碼片段希望澄清:Python創建應用於集合中的元素的函數結果

results = set()  
for node in nodes: 
    results = set.union(results, foo(node)) 

雖然代碼完成我想要的,我相信它可以改寫更好,更簡潔。因爲我不得不多次重複這個構造,所以任何幫助都非常感謝。

在此先感謝。

回答

3
results = set()  
for node in nodes: 
    results.update(foo(node)) 

results = set.union(*[foo(node) for node in nodes]) 

如果nodes可以是空的,然後用這個來確保它不會拋出異常:

results = set.union(set(), *[foo(node) for node in nodes]) 
+0

你的第二個解決方案正是我正在尋找的,謝謝!雖然我知道set.union(* x),但我不知道是否以及如何首先應用函數時如何應用它。 – user1960897

+0

+1爲第二個解決方案 – gefei

+1

不應該是'set.union(set(),* [foo(node)...'? – georg

0

我認爲您的解決方案是確定的,除了您可以使用|=運營商設置聯盟:

results = set()  
for node in nodes: 
    results |= set(foo(node)) 

或者你可以收集列表中的所有結果,並投它到底要設置一次(如果你不希望大量的數據)

0

也許使用reduce

results = reduce(lambda x,y: set.union(x,y), [foo(x) for x in nodes]) 
+0

這會創建很多臨時集,eumiro的答案可以避免。 – Max

+0

@Max它不會。請參閱http://docs.python.org/2/library/functions.html#reduce。但是,我同意eumiro的第二個解決方案更優雅 – gefei

+0

set.union返回一個新集合 – Max

相關問題