在Python中,如何编写包含集合的集合?

时间:2013-05-17 23:11:34

标签: python

我们在Python中知道,可以通过写出所有这些元素来定义集合:

a_set={1,"xyz"}

Python的书籍都说集合的元素可以是任何数据类型。所以我们应该能够写出一个包含集合的集合。我试着把它写成:

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中写出一个包含集合的集合?

3 个答案:

答案 0 :(得分:15)

最里面的集合必须是frozenset类型,它是集合的不可变版本。

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

来自docs

  

class frozenset([iterable])

     

返回一个新的set或frozenset对象,其元素取自iterable。集合的元素必须是可以清除的。要表示集合集,内部集合必须是冻结集合对象。如果未指定iterable,则返回一个新的空集。

答案 1 :(得分:6)

集合只能存储不可变对象,而集合本身是可变的。所以一个集合不能包含另一个集合。

使用frozenset

  

要表示集合集,内部集合必须是frozenset个对象。

答案 2 :(得分: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])])