60

我正在使用 The Quick Python Book 学习 Python 3,作者在其中谈到了 freezesets,指出由于集合是可变的,因此不可散列,因此不适合作为字典键,因此引入了它们的冻结对应项。除了元组是有序数据结构而frozenset(或更一般地说是集合)是无序的明显区别之外,元组和frozenset之间还有其他区别吗?

4

4 回答 4

99

tuples是不可变的listsfrozensets是不可变的sets

tuples确实是对象的有序集合,但它们可以包含重复对象和不可散列的对象,并且具有切片功能

frozensets没有索引,但您具有sets- O(1) 元素查找的功能,以及联合和交集等功能。它们也不能包含重复项,就像它们的可变对应项一样。

于 2013-01-20T07:07:22.753 回答
13

有点反直觉 - 这个好词怎么样:

sss = frozenset('abc')
sss |= set('efg')

将产生:

frozenset(['a', 'c', 'b', 'e', 'g', 'f'])

当然,这等价于 x = x | 是的,所以不改变原来的frozenset,但它不会对代码审查者的“不可变”一词产生一半的嘲弄!

于 2013-11-20T18:32:01.890 回答
6

想到的一个区别是重复的问题。一个 tuple(1, 1, 1, 1, 2, 2, 2)正是您所期望的,但是 freezeset 会删除所有这些重复项,给您留下frozenset([1, 2]).

于 2013-01-20T07:06:55.220 回答
5

Volatility 确实提到了frozensets 没有被索引。我在看其他功能,所以没有立即意识到标准的 python 切片是不可能的。

a = frozenset((1, 1, 1, 1, 2, 2, 2))  # results in frozenset([1, 2])
print a[0] 

会报错:

TypeError: 'frozenset' object does not support indexing

显然它没有被索引,但尽管值得在这里明确添加

于 2013-05-27T09:01:11.893 回答