有没有更好的方法比较字典值

88 投票
9 回答
202061 浏览
提问于 2025-04-15 17:04

我现在正在使用以下这个函数来比较字典里的值,并显示所有不匹配的值。有没有更快或者更好的方法来做到这一点呢?

match = True
for keys in dict1:
    if dict1[keys] != dict2[keys]:
        match = False
        print keys
        print dict1[keys],
        print  '->' ,
        print dict2[keys]

补充说明:这两个字典包含相同的键。

9 个回答

16

你也可以用集合来解决这个问题

>>> a = {'x': 1, 'y': 2}
>>> b = {'y': 2, 'x': 1}
>>> set(a.iteritems())-set(b.iteritems())
set([])
>>> a['y']=3
>>> set(a.iteritems())-set(b.iteritems())
set([('y', 3)])
>>> set(b.iteritems())-set(a.iteritems())
set([('y', 2)])
>>> set(b.iteritems())^set(a.iteritems())
set([('y', 3), ('y', 2)])
229

如果这个问题的真正意图是比较字典,而不是打印出它们的差异,那么答案是

dict1 == dict2

之前有人提到过这个,但我觉得它被其他信息淹没了。虽然看起来有点表面,但字典的值比较其实有很深的含义。它包括:

  • 键的数量(如果数量不一样,字典就不相等)
  • 键的名称(如果名称不一样,它们就不相等)
  • 每个键的值(这些值也必须是相等的)

最后一点看起来很简单,但其实很有趣,因为这意味着所有这些也适用于嵌套的字典。比如:

 m1 = {'f':True}
 m2 = {'f':True}
 m3 = {'a':1, 2:2, 3:m1}
 m4 = {'a':1, 2:2, 3:m2}
 m3 == m4  # True

比较列表时也有类似的规则。这一切让我们在比较复杂的Json结构时,只需简单地用“==”就能搞定。

51

如果这两个字典的键完全相同,而你又想要找出任何值的不同之处,那其实能做的事情不多;你可以试试下面这种方法:

diffkeys = [k for k in dict1 if dict1[k] != dict2[k]]
for k in diffkeys:
  print k, ':', dict1[k], '->', dict2[k]

这个方法和你现在的做法差不多,不过你可以在循环之前先把不同的键排序,这样展示出来的结果可能会更好看。

撰写回答