Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否有一种数据类型/结构可以:保存数字列表、可散列、无序并允许重复_Python_Python 3.x_Data Structures_Set_Hashable - Fatal编程技术网

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

Python 是否有一种数据类型/结构可以:保存数字列表、可散列、无序并允许重复,python,python-3.x,data-structures,set,hashable,Python,Python 3.x,Data Structures,Set,Hashable,我在看这个,然后就我的问题问了这个问题 本质上,我想要一个类似元组但无序的数据类型,或者类似于冻结集但允许重复的数据类型(我意识到定义集无法做到这一点,但我只是解释我想要的):可散列、无序、允许重复 我试图创建一组此类数据,用于检查不同的值,如(1,2,3),应与(1,3,2)相同。我知道一个解决方案是使用一个列表,对其排序,然后将其变成一个元组,但我必须这样做很多次,元组长度可能很长,因此如果可能的话,我不希望每次都进行排序 编辑: 这个问题已略有改变。现在我有一个元组列表,例如: list_

我在看这个,然后就我的问题问了这个问题

本质上,我想要一个类似元组但无序的数据类型,或者类似于冻结集但允许重复的数据类型(我意识到定义集无法做到这一点,但我只是解释我想要的):可散列、无序、允许重复

我试图创建一组此类数据,用于检查不同的值,如(1,2,3),应与(1,3,2)相同。我知道一个解决方案是使用一个列表,对其排序,然后将其变成一个元组,但我必须这样做很多次,元组长度可能很长,因此如果可能的话,我不希望每次都进行排序

编辑:

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

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

我想我应该对元组列表进行排序,然后让列表成为元组,它就可以进入集合并正常工作了。我知道我说过我不想排序,但我看不到其他方法


谢谢

根据您的用例,您可以将
计数器
对象包装在
映射ProxyType
中,这样您就可以以只读方式访问底层的
计数器

>>> from collections import Counter
>>> from types import MappingProxyType
>>> d1 = MappingProxyType(Counter("aab"))
>>> d2 = MappingProxyType(Counter("aba"))
>>> d1 == d2
True
据我所知,没有办法获取对底层
计数器
对象的引用,以便修改它们

您只需要做一些工作来迭代重复项;幸运的是,
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']

根据您的用例,您可以将
计数器
对象包装在
MappingProxyType
中,这样您就可以以只读方式访问底层的
计数器

>>> from collections import Counter
>>> from types import MappingProxyType
>>> d1 = MappingProxyType(Counter("aab"))
>>> d2 = MappingProxyType(Counter("aba"))
>>> d1 == d2
True
据我所知,没有办法获取对底层
计数器
对象的引用,以便修改它们

您只需要做一些工作来迭代重复项;幸运的是,
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']


你可以在这里查看答案:那么基本上你想要一个不可变的?@Aran Fey:听起来更像是一个AFAIK不在任何标准模块(或内置模块)中的计数器。计数器基本上是一个多集;它只是不显式地存储每个对象,而是一个计数,指示在元素的迭代中需要包含该对象多少次。
{{a',a',b'}}
(组成多步语法)和
计数器({a':2',b':1})之间几乎没有什么有意义的区别。
@chepner:我想这是真的。FWIW,有一个
multiset
模块。你可以在这里查看答案:那么基本上你想要一个不可变的?@Aran Fey:听起来更像是一个,而AFAIK不在任何标准模块(或内置模块)中。计数器基本上是一个multiset;它只是不显式地存储每个对象,而是一个计数,指示在元素的迭代中需要包含该对象多少次。
{{a',a',b'}}
(组成多步语法)和
计数器({a':2',b':1})之间几乎没有什么有意义的区别。
@chepner:我想这是真的。FWIW上有一个
multiset
模块。谢谢你的评论,请查看我的编辑。计数器可以用来表示我的数据,但是我需要将它添加到一个集合中,因为我想计算不同元组列表的数量。但计数器是不可散列的,正如我所知,它们都是MappingProxyType。我刚开始说我不想排序,但也许这是唯一的选择,对元组列表进行排序,使元组列表成为元组的元组,然后将其添加到集合中。这将涵盖我的情况,但如果您认为有更好的方法,请告诉我。我不明白您为什么需要
Counter
MappingProxyType
进行散列
MappingProxyType(计数器([(2,2,2),(2,2,1),(2,2,2)])
。我可能不知道MappingProxyType为我做了什么,但计数器([(2,2,2),(2,2,1),(2,2,2,2)]只是一个例子,我将有一堆这样的计数器,我需要进行计数。将它们添加到集合中似乎是最有效的方法,而不是在列表中检查它们是否在其中。因为iirc对于列表来说就像O(n),但是对于集合来说就像O(1),所以我希望它是可散列的。对不起,如果我只是不明白好吧,我明白了,你改变的问题现在完全不同了。我以为你是从(比如)多个元组到多个元组,但是你是从多个元组到多个元组,没错。我可以对列表中的各个元组进行排序,然后将其作为一个元组,然后我可以使用set()。。。无论如何,这样做可能过于复杂了。我不想列出我正在解决的问题,因为我想试着自己解决它,但基本上是试着从形状上找到独特的子树。因此,我试图以某种方式将树的形状转换成我所能做到的最简单的表示形式,而我在这方面遇到了一些麻烦。(2,2,2),(2,2,1),(2,2,2)表示根有2个子元素,每个元组都是从它所表示的路由出来的路径#of childrenthanks有关注释,请检查我的编辑。计数器可以用来表示我的数据,但是我需要将它添加到一个集合中,因为我想计算不同元组列表的数量。但计数器是不可散列的,正如我所知,它们都是MappingProxyType。我刚开始说我不想分类,但也许是这样