像frozenset这样维护插入顺序的数据结构?

问题描述

我需要具有这些属性的类似集合的数据结构:

  • 可散列
  • 没有重复的元素
  • 维持秩序
  • 不可变
  • 可迭代
  • 标准库的一部分?想保持简单

发生了什么:

frozenset([3,1,2,3]) -> frozenset(1,3)

我需要什么:

frozenset*([3,3]) -> frozenset*(3,2)

我以为我可以使用frozenset但是集合和frozensets 重新排列元素。我认为这是为了更快的重复检查? 但无论如何我不能重新排序。

解决方法

从 Python 3.7 开始,dicts 不再对元素重新排序,而是保证保留插入顺序。您可以使用字典,其中键是您的设置项,而值将被忽略。

>>> dict.fromkeys([3,1,2,3])
{3: None,1: None,2: None}

字典不会被冻结,所以如果这很重要,那么您可以先将所有项目放入字典中,然后根据键构建一个元组。

>>> tuple(dict.fromkeys([3,3]).keys())
(3,2)

这将非常接近于 frozenset。主要区别在于检查一个项目是否在元组中需要 O(n) 而不是 O(1) 时间。