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

Posted

技术标签:

【中文标题】像frozenset这样维护插入顺序的数据结构?【英文标题】:Data structure like frozenset which maintains insertion order? 【发布时间】:2021-05-16 12:50:23 【问题描述】:

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

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

发生了什么:

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

我需要什么:

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

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

【问题讨论】:

标准库中没有这样的数据结构。 也许只使用元组,并确保它们在创建时没有重复的元素。 " set 和 frozensets 对元素进行排序" 不,它们没有。这两种数据结构没有内在的顺序。在这种情况下,你看到的任何东西都是一个实现细节,大多数——但不是全部——整数只是简单地散列到自己,因此明显的排序 无论如何,您需要设置对象的哪些特定方面?快速查找是重要的部分吗?这是主要的用例。听起来你似乎只关心没有重复...... 例如,在 Python 3.7+ 上,您可以只使用元组并使用函数来确保没有重复并保持顺序(正如已经提到的),所以只需:def no_dupe(data): return tuple(dict.fromkeys(data)) 【参考方案1】:

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

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

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

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

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

【讨论】:

无需致电.keys 对,它是可选的。我更喜欢在这里明确。 (我不喜欢遍历字典如何遍历其键。这是 Python 罕见的失误之一。)

以上是关于像frozenset这样维护插入顺序的数据结构?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 维护 Hash 插入顺序

是否可以针对特定字段在 mysql 或 mongodb 中按顺序保存数据?

回文数或回文数是指一个像14641这样“对称”的数,即:将这个数的数字按相反的顺序重新排列后,所得到的数和原来的数一样。这里,“回文”是指像“妈妈爱我,我爱妈妈”这样的,正读反读都相同的单词或句子。

HashTable 是不是维护插入顺序?

维护二叉树中的列表顺序

Groupby 和 collect_list 基于 PySpark 中的另一列维护顺序