Python 如何比较两本有列表的词典?

Python 如何比较两本有列表的词典?,python,python-3.x,python-2.7,Python,Python 3.x,Python 2.7,我有两本字典,例如: first={'test':[1,2,3]} 第二个={‘测试’:[3,2,1]} 第一个==第二个#错误 有没有一种方法可以比较这两个字典并忽略其中列表中值的顺序 我尝试使用了OrderedDict,但没有成功: 从集合导入订单数据 first=OrderedDict({‘测试’:[1,2,3]}) second=OrderedDict({‘测试’:[3,2,1]}) 第一个==第二个#错误 使用列表的计数器(或设置s,如果您有[1,2]==[2,1,2]),用于包含的

我有两本字典,例如:

first={'test':[1,2,3]}
第二个={‘测试’:[3,2,1]}
第一个==第二个#错误
有没有一种方法可以比较这两个字典并忽略其中列表中值的顺序

我尝试使用了
OrderedDict
,但没有成功:

从集合导入订单数据
first=OrderedDict({‘测试’:[1,2,3]})
second=OrderedDict({‘测试’:[3,2,1]})
第一个==第二个#错误

使用列表的
计数器(或
设置
s,如果您有
[1,2]==[2,1,2]
),用于包含的列表:

from collections import Counter

first = { 'test' :  [1, 2, 3] }
second = { 'test' :  [3, 2, 1] }
third = { 'test' :  [3, 2, 1], "meh":"" }

def comp_dict(d1,d2):
    return d1.keys() == d2.keys() and all(Counter(d1[k]) == Counter(d2[k]) for k in d1)
    # or 
    # return d1.keys() == d2.keys() and all(set(d1[k]) == set(d2[k]) for k in d1)

print(comp_dict(first, second))
print(comp_dict(first, third))
输出:

True
False

使用列表的
计数器
s(或
设置
s,如果您有
[1,2]==[2,1,2]
)用于包含的列表:

from collections import Counter

first = { 'test' :  [1, 2, 3] }
second = { 'test' :  [3, 2, 1] }
third = { 'test' :  [3, 2, 1], "meh":"" }

def comp_dict(d1,d2):
    return d1.keys() == d2.keys() and all(Counter(d1[k]) == Counter(d2[k]) for k in d1)
    # or 
    # return d1.keys() == d2.keys() and all(set(d1[k]) == set(d2[k]) for k in d1)

print(comp_dict(first, second))
print(comp_dict(first, third))
输出:

True
False
我找到了这个解决方案:

导入单元测试
类TestClass(unittest.TestCase):
def测试计数两个指令(自身、d1、d2):
自组装计数相等(d1、d2)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
第一个={'test':[1,2,3]}
第二个={‘测试’:[3,2,1]}
t=TestClass()
t、 测试计数两次记录(d1=第一次,d2=第二次)
我找到了这个解决方案:

导入单元测试
类TestClass(unittest.TestCase):
def测试计数两个指令(自身、d1、d2):
自组装计数相等(d1、d2)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
第一个={'test':[1,2,3]}
第二个={‘测试’:[3,2,1]}
t=TestClass()
t、 测试计数两次记录(d1=第一次,d2=第二次)

如果要比较两个dict(真或假)

first={'test':[1,2,3]}
第二个={‘测试’:[3,2,1]}
是否等于第一个=第二个
你是平等的吗

如果要比较两个dict(真或假)

first={'test':[1,2,3]}
第二个={‘测试’:[3,2,1]}
是否等于第一个=第二个
你是平等的吗

[1,2,3]
[3,2,1]
不同。如果您不关心顺序,则可能不应该使用列表。OrderedDict是对键进行排序,而不是对值进行排序,这会使问题变得更糟,因为您也不关心键的顺序。“列表”的平等标准是什么?例如,[1,2,3]是否等于[1,2,3,3]?为什么OrderedICT会起作用?这仅仅意味着字典本身是有序的,它不会对键或值进行排序(
OrderedDict(test=[3,2,1])={“estt”:[1,2,3]}
将是一个非常意外的结果)。我不知道MongoDB支持什么,我也不知道您通常在做什么,但如果您确实需要一个集合,您应该使用一个集合。如果不能进入MongoDB,您可以在与数据库通信时进行转换。您可以看看
[1,2,3]
[3,2,1]
不同。如果您不关心顺序,则可能不应该使用列表。OrderedDict是对键进行排序,而不是对值进行排序,这会使问题变得更糟,因为您也不关心键的顺序。“列表”的平等标准是什么?例如,[1,2,3]是否等于[1,2,3,3]?为什么OrderedICT会起作用?这仅仅意味着字典本身是有序的,它不会对键或值进行排序(
OrderedDict(test=[3,2,1])={“estt”:[1,2,3]}
将是一个非常意外的结果)。我不知道MongoDB支持什么,我也不知道您通常在做什么,但如果您确实需要一个集合,您应该使用一个集合。如果这不能进入MongoDB,您可以在与数据库通信时进行转换。您可以查看一下,这对我没有帮助,因为它将返回
False
,我希望输出为
True
,而不考虑内部列表的顺序。这对我没有帮助,因为它将返回
False
,我希望输出为
True
不考虑内部列表的顺序。