有没有更好的方法比较字典值
我现在正在使用以下这个函数来比较字典里的值,并显示所有不匹配的值。有没有更快或者更好的方法来做到这一点呢?
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]
这个方法和你现在的做法差不多,不过你可以在循环之前先把不同的键排序,这样展示出来的结果可能会更好看。