是否有一种数据类型/结构可以:保存数字列表、可哈希、无序并允许重复



在Python中研究了元组和frozenset之间的差异,并为我的问题提出了这个问题

本质上,我想要一个类似元组但无序的数据类型,或者类似于frozenset但允许重复的数据类型(我意识到根据定义集不能做到这一点,但我只是在解释我想要什么(:可散列、无序、允许重复。

我正在尝试制作一组这种类型的数据来检查不同的值,比如(1,2,3(应该被视为与(1,3,2(相同。我知道一种解决方案是使用列表,对其进行排序,然后使其成为元组,但我必须多次这样做,并且元组长度可能很长,所以如果可能的话,我不希望每次都排序。

编辑:

问题略有改变。现在我有一个元组列表,例如:list_tuple=[(2,2,2(,(2,1,1(]

问题没有太大变化,元组有一个重要的顺序,但元组的顺序没有。因此例如这与前面的相同:[(2,2,2(,(2,1,1(,(2,4,2,2(]我会得到很多这样的东西,我想添加到一个集合中,这样我就可以计算元组的不同列表的数量。所以实际上,我有同样的问题,顺序不重要,允许重复,除了我们处理的是元组而不是int。

我想我应该对元组列表进行排序,然后使列表成为元组,这样它就可以进入集合并正常工作。我知道我说过我不想分类,但我看不出其他办法。

感谢

根据您的用例,您可以将Counter对象包装在MappingProxyType中,从而为您提供对底层Counter的只读访问。

>>> from collections import Counter
>>> from types import MappingProxyType
>>> d1 = MappingProxyType(Counter("aab"))
>>> d2 = MappingProxyType(Counter("aba"))
>>> d1 == d2
True

据我所知,没有办法获得对底层Counter对象的引用,以便修改它们。

您只需要做一些工作来迭代重复项;幸运的是,itertools模块完成了大部分繁重的工作。

>>> from itertools import chain, startup, repeat
>>> list(chain.from_iterable(starmap(repeat, d1.items())))
['a', 'a', 'b']
>>> list(chain.from_iterable(starmap(repeat, d2.items())))
['a', 'a', 'b']

最新更新