7

我们知道在 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 中写出一个包含集合的集合呢?

4

3 回答 3

16

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

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

文档

类frozenset([可迭代])

返回一个新的 set 或 frozenset 对象,其元素取自可迭代对象。集合的元素必须是可散列的。要表示集合的集合,内部集合必须是 freezeset 对象。如果未指定 iterable,则返回一个新的空集。

于 2013-05-17T23:14:05.927 回答
6

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

使用freezeset

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

于 2013-05-17T23:14:25.940 回答
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])])
于 2013-05-17T23:21:59.253 回答