2013-05-17 110 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])]) 
相关问题