我正在使用The Quick Python Book学习Python 3,其中作者讨论了frozensets,声明由于集合是可变的,因此不可删除,从而不适合成为字典键,因此引入了它们的冻结对应物。除了元组是有序数据结构的明显差异,而冻结集,或更一般地说是集合,是无序的,元组和冻结集之间是否还有其他差异?
答案 0 :(得分:70)
tuples
是不可变的lists
,frozensets
是不可变的sets
。
tuples
确实是一个有序的对象集合,但它们可以包含重复项和不可用的对象,并具有切片功能
frozensets
未编入索引,但您具有sets
- O(1)元素查找功能以及联合和交叉点等功能。它们也不能包含重复项,就像它们的可变副本一样。
答案 1 :(得分:11)
有点反直觉 - 这个好消息:
sss = frozenset('abc')
sss |= set('efg')
将屈服:
frozenset(['a', 'c', 'b', 'e', 'g', 'f'])
当然,这相当于x = x | y,所以不要改变原来的冷冻集,但它不会对代码审查者的“不可变”一词进行嘲弄!
答案 2 :(得分:6)
浮现在脑海中的一个区别是重复问题。 (1, 1, 1, 1, 2, 2, 2)
的元组将完全符合您的预期,但冻结集会删除所有重复项,并为您留下frozenset([1, 2])
。
答案 3 :(得分:5)
波动性确实提到了冻结没有编入索引。我正在查看其他功能,所以没有立即意识到标准的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
事实上很明显它没有编入索引,但是值得在这里明确添加