2010-08-09 55 views
23

假設我有一個集合的列表,我想要在該列表中的所有集合上獲得聯合。有沒有什麼辦法可以使用生成器表達式來完成此操作?換句話說,我怎麼能創建該列表中的所有集合的聯盟直接作爲frozenset如何使用生成器表達式創建多個集合的聯合?

+0

參見:http://stackoverflow.com/ a/5182801/1959808 – 2017-03-04 06:06:22

回答

43

只需使用the .union() method

>>> l = [set([1,2,3]), set([4,5,6]), set([1,4,9])] 
>>> frozenset().union(*l) 
frozenset([1, 2, 3, 4, 5, 6, 9]) 

這適用於任何可迭代的iterables。

+1

只要注意,使用'frozenset.union'作爲一個非綁定方法會更簡潔,如果'l'包含'frozenset's例如'frozenset.union(* 1)'。 'set.union'也一樣。 – vaultah 2016-12-02 16:00:08

4

嵌套的發生器表達式。但我認爲他們有點神祕,所以KennyTM建議的方式可能會更清晰。

frozenset(some_item for some_set in some_sets for some_item in some_set) 
+1

+1爲巧妙 – aaronasterling 2010-08-09 08:08:39

+0

這確實更清楚,但比肯尼的解決方案慢大約4倍 – fransua 2015-05-06 13:39:46

5

我假設你試圖避免的是在建立聯合時,冷凝對象的中間創作?

以下是一種方法。 注:這個原本用來itertools.chain(),但正如肯尼的評論指出,下面的版本稍有好轉:

import itertools 

def mkunion(*args): 
    return frozenset(itertools.chain.from_iterable(args)) 

調用是這樣的:

a = set(['a','b','c']) 
b = set(['a','e','f']) 
c = mkunion(a,b)  # => frozenset(['a', 'c', 'b', 'e', 'f']) 
+0

如果你要'.chain(* args)',使用'chain.from_iterable'。 – kennytm 2010-08-09 08:33:04

+0

@KennyTM:好點,我做了改變。 – 2010-08-09 16:28:22

+1

我的性能測試結果(使用python 3):當套件數量<10000時,KennyTM的響應速度稍快,但這種響應速度稍微快一些,而且30000套 – 2012-07-28 05:19:39