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