Python中元组和frozensets之间的区别

时间:2013-01-20 07:00:17

标签: python data-structures set tuples

我正在使用The Quick Python Book学习Python 3,其中作者讨论了frozensets,声明由于集合是可变的,因此不可删除,从而不适合成为字典键,因此引入了它们的冻结对应物。除了元组是有序数据结构的明显差异,而冻结集,或更一般地说是集合,是无序的,元组和冻结集之间是否还有其他差异?

4 个答案:

答案 0 :(得分:70)

tuples是不可变的listsfrozensets是不可变的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

事实上很明显它没有编入索引,但是值得在这里明确添加