我目前正在使用以下函数来比较字典值。有更快或更好的方法吗?
match = True
for keys in dict1:
if dict1[keys] != dict2[keys]:
match = False
print keys
print dict1[keys],
print '->' ,
print dict2[keys]
编辑:两个词都包含相同的键。
如果dicts具有相同的键组,并且您需要所有这些打印以获得任何值差异,那么您无能为力;也许是这样的:
diffkeys = [k for k in dict1 if dict1[k] != dict2[k]]
for k in diffkeys:
print k, ':', dict1[k], '->', dict2[k]
几乎与你所拥有的相同,但你可以通过在循环之前对diffkeys进行排序来获得更好的表现。
如果问题的真正意图是dicts之间的比较(而不是打印差异),答案是
dict1 == dict2
之前已经提到过,但我觉得它在其他信息中略显淹没。它可能看起来很肤浅,但dicts的价值比较实际上具有强大的语义。它涵盖
最后一点再次显得微不足道,但实际上很有意思,因为它意味着所有这些都递归地应用于嵌套的dicts。例如。
m1 = {'f':True}
m2 = {'f':True}
m3 = {'a':1, 2:2, 3:m1}
m4 = {'a':1, 2:2, 3:m2}
m3 == m4 # True
对于列表的比较存在类似的语义。所有这些使得它成为例如比较深Json结构,单独用简单的“==”。
你也可以使用套装
>>> 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)])
嗯,你在描述qazxsw poi(检查摊位是否相等)
但是你的代码所做的是dict1 == dict2
(检查dict1中的所有条目是否与dict2中的条目相同)
不确定这是否有帮助,但在我的应用程序中,我必须检查字典是否已更改。
这样做是行不通的,因为基本上它仍然是同一个对象:
all( dict1[k]==dict2[k] for k in dict1 )
使用复制/深度复制工作:
val={'A':1,'B':2}
old_val=val
val['A']=10
if old_val != val:
print('changed')
import copy
val={'A':1,'B':2}
old_val=copy.deepcopy(val)
val['A']=10
if old_val != val:
print('changed')
如果你只是比较平等,你可以这样做:
>>> a = {'x': 1, 'y': 2}
>>> b = {'y': 2, 'x': 1}
>>> print a == b
True
>>> c = {'z': 1}
>>> print a == c
False
>>>
否则,我看到的唯一主要问题是,如果dict1中的某个键不在dict2中,那么你将得到一个KeyError,所以你可能想要这样做:
if not dict1 == dict2:
match = False
您可以将其压缩为理解,以获得不匹配的键列表:
for key in dict1:
if not key in dict2 or dict1[key] != dict2[key]:
match = False
我能想到的唯一其他优化可能是使用“len(dict)”来确定哪个dict具有较少的条目并首先循环通过该条目以使最短的循环成为可能。
如果您的词典是深层嵌套的,并且它们包含不同类型的集合,您可以将它们转换为json字符串并进行比较。
mismatch_keys = [key for key in x if not key in y or x[key] != y[key]]
match = not bool(mismatch_keys) #If the list is not empty, they don't match
for key in mismatch_keys:
print key
print '%s -> %s' % (dict1[key],dict2[key])
警告 - 如果您的词典在值中包含二进制字符串,则此解决方案可能无效,因为这不是json可序列化的