2013-05-17 107 views
7

我們知道在Python中,一組可以通過寫出其所有元素這樣的定義:Python中的在Python中,如何編寫一個包含集合的集合?

a_set={1,"xyz"} 

和書籍都說了一組元素可以是任何數據類型。所以我們應該能夠寫出一個包含集合的集合。我試圖把它寫成:

a_set={1,{"xyz"}} 

IDLE報告錯誤:

Traceback (most recent call last): 
    File "<pyshell#58>", line 1, in <module> 
    a_set={1,{"xyz"}} 
TypeError: unhashable type: 'set' 

我想這可能是因爲Python正試圖把它理解爲一個字典。那麼,如何在Python中寫出一個包含集合的集合呢?

+0

可能重複[?爲什麼不Python的哈希的設置(http://stackoverflow.com/questions/6310867/why-arent-python-sets-hashable) –

+0

雖然它不直接回答問題,[爲什麼字典鍵必須是不可改變的?](http://docs.python.org/3.3/faq/ Python FAQ中的design.html#why-must-dictionary-keys-be-immutable)與此處相關。一個集合的值基本上與字典的鍵值相同(它們都存儲在散列表中),所以不能將集合放在集合中,原因與不能將字典用作字典鍵的原因相同。 – abarnert

回答

15

最內層集合需要是frozenset類型,它是一個集合的不可變版本。

>>> a_set = {1, frozenset(['xyz'])} 
>>> a_set 
set([1, frozenset(['xyz'])]) 

docs

class frozenset([iterable])

Return a new set or frozenset object whose elements are taken from iterable. The elements of a set must be hashable. To represent sets of sets, the inner sets must be frozenset objects. If iterable is not specified, a new empty set is returned.

+2

+1。但是編寫'{1,frozenset({'xyz'})}'可能會更清晰。 – abarnert

+0

我明白了。謝謝你們! – user2384994

+2

Phfff,6個問題提案和12個RTFM答案? SO的標準相當低。 – martineau

6

集只能存儲一個不可改變的對象,而集是可變的自己。所以一個集合不能包含另一個集合。

使用frozenset

To represent sets of sets , the inner sets must be frozenset objects.

+1

值得注意的是,限制是集合只能包含通常但不一定是「不可變」的「可哈」對象。例如,未定義'__hash__'或'__eq__'的自定義類的實例是可散列化的,但可以通過賦予屬性進行變異。這是允許的,因爲這樣一個對象的哈希不受其內容的影響,只有它的身份,所以它不會改變,如果對象發生了變化。您可以創建部分可變和部分不可變的對象,並使用不可變部分來定義哈希。 – Blckknght

1

這個例子說明了如何使用frozenset

a_set = frozenset([1,2,3]) 
b_set = frozenset([1,3]) 
a_set_copy = frozenset([2,3,1]) 

set_of_sets = set([a_set, b_set, a_set_copy]) 

print set_of_sets 
# set([frozenset([1, 3]), frozenset([1, 2, 3])]) 
相關問題