2011-05-09 83 views
75

我想在Python中創建一組集合。我無法弄清楚如何去做。如何在Python中創建一組集合?

與空集xx開始:

xx = set([]) 
# Now we have some other set, for example 
elements = set([2,3,4]) 
xx.add(elements) 

,但我得到

TypeError: unhashable type: 'list' 

TypeError: unhashable type: 'set' 

是否有可能有一組套在Python?

我正在處理大量集合集合,我希望能夠不必處理重複集合(集合A1,A2,... B的集合B,如果Ai集合將會「取消」兩個集合= Aj)

回答

15

裏面使用frozenset

+7

也許你可以給出一些有關Python中的可變/不可變對象的指針,因爲他是新的? – 2011-05-09 00:18:49

+2

@Seth:我可以,但可變性不是一個因素。 – 2011-05-09 00:19:44

+0

非常感謝!剛剛閱讀:可變性現在。看起來像一組列表也可能工作,但冷凍集似乎完成。再次感謝! – Matt 2011-05-09 00:23:14

74

Python的抱怨,因爲內部set對象是可變的,因此不可哈希。解決方法是使用frozenset作爲內部集合,表示您無意修改它們。

28

人們已經提到過,您可以用frozenset()做到這一點,所以我只需要添加一個代碼是如何實現這一點:

比如你想從列表下面的列表中創建一組集:

t = [[], [1, 2], [5], [1, 2, 5], [1, 2, 3, 4], [1, 2, 3, 6]] 

你可以創建你以下面的方式設置:

t1 = set(frozenset(i) for i in t) 
+3

或者您可以使用地圖! 'set(map(frozenset,t))' – 2017-01-06 19:55:58

3

所以我有完全相同的問題。我想創建一個可以作爲一組集合使用的數據結構。問題是這些集合必須包含不可變的對象。所以,你可以做的只是把它作爲一組元組。這對我來說工作得很好!

A = set() 
A.add((2,3,4))##adds the element 
A.add((2,3,4))##does not add the same element 
A.add((2,3,5))##adds the element, because it is different! 
+5

在元組中,元素順序很重要。因此'A.add((4,3,2)); A.add((2,4,3)); A.add((2,3,4))將增加三個不同的元素,而最初的問題是關於「集合集合」,這意味着'(2,3,4)','(4,3, 2)','(2,4,3)'是一樣的。 – 2017-02-28 06:46:43