【问题标题】:Difference between tuples and frozensets in PythonPython中元组和冻结集的区别
【发布时间】:2013-01-03 13:11:34
【问题描述】:

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

【问题讨论】:

    标签: python data-structures set tuples


    【解决方案1】:

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

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

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

    【讨论】:

    • 所以 freezesets 给了我重复删除、设置操作和查找只需要恒定时间,很好 :)
    • @legends2k 他们仍然设置;)
    • 是的,我看到元组和冻结集之间的所有差异实际上都是元组和集合之间的差异。
    • @Volatility 还有另一个相似之处:tuples 和 frozensets 是可散列的; lists 和 sets 不是。
    • @AndreaBergonzo 包含不可散列对象的元组实际上是不可散列的(例如,尝试将 ([],) 放入一个集合中)。但是,它们将是可散列的,但与始终不可散列的列表不同。
    【解决方案2】:

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

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

    将产生:

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

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

    【讨论】:

    • 如果你输入:sss = set('abc')。它会做同样的事情
    • @Ben,我认为您错过了意图 - freezeset 是不可变的,因此在 x 中以不同的 freezeset 内容开始和结束可能会吸引一些代码审阅者。集合预计会发生变化,因此您以不同的方式阅读代码。
    • 不可变并不意味着不能重用变量名!如果您运行id(sss),您将看到第一个sss 变量代表与第二个sss 变量不同的对象。 (不可变 str 对象的工作方式相同。)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      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
      

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

      【讨论】:

      • 是的,这是因为frozensets 也是集合,因此不支持像集合一样的索引。
      • 集合不排序,那是什么意思呢?如果您只是想要其中的一个项目,您可以记住它们是可迭代的,并执行类似print iter(a).next() ...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 1970-01-01
      • 2022-12-17
      • 1970-01-01
      • 2014-02-19
      • 1970-01-01
      相关资源
      最近更新 更多