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

在Python中,如何编写包含集合的集合?,python,Python,我们知道,在Python中,可以通过如下方式写出集合的所有元素来定义集合: a_set={1,"xyz"} Python书籍都说集合的元素可以是任何数据类型。所以我们应该能够写出一个包含一个集合的集合。我试着把它写成: a_set={1,{"xyz"}} 但报告了一个错误: Traceback (most recent call last): File "<pyshell#58>", line 1, in <module> a_set={1,{"xyz"}

我们知道,在Python中,可以通过如下方式写出集合的所有元素来定义集合:

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

a_set={1,{"xyz"}}
但报告了一个错误:

Traceback (most recent call last):
  File "<pyshell#58>", line 1, in <module>
    a_set={1,{"xyz"}}
TypeError: unhashable type: 'set'
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
a_集={1,{“xyz”}
TypeError:无法损坏的类型:“set”

我认为这可能是因为Python试图将其理解为字典。那么,如何在Python中写出一个包含集合的集合呢?

最内部的集合需要是一个集合的不可变版本

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

类冻结集([iterable])

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


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

使用:

要表示集合的集合,内部集合必须是
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])])

虽然它不能直接回答问题,但Python中的常见问题解答与此相关。集合的值基本上与字典的键相同(它们都存储在哈希表中),因此不能将集合放入集合,原因与不能将dict用作dict键相同。+1。但是写
{1,frozenset({'xyz'}}}
.Phfff,6票赞成这个问题,12票赞成RTFM答案可能会更清楚?这里的标准非常低,值得注意的是,集合只能包含“可散列”的对象,这些对象通常是,但不一定是“不可变的”。例如,未定义
\uuuuuhash\uuuuuu
\uuuuuuuueq\uuuuu
的自定义类的实例是可散列的,但可以通过分配给属性进行变异。这是允许的,因为这样一个对象的散列不受其内容的影响,只受其标识的影响,所以如果对象发生变化,它不会改变。您可以创建部分可变和部分不可变的对象,并使用不可变部分定义哈希。