在Python中优雅地比较两个字典中的元素是否在容忍范围内
假设我有这两个字典:
d1 = {'a' : 1.001, 'b' : 2.0002, 'c' : 3}
d2 = {'a' : 1.002, 'b' : 2, 'c' : 3, 'd' : 4}
那么,有什么优雅的方法可以在一定的容忍度下比较它们呢?
目前我用的是:
TOL = 0.001
different = False
for key in d1.keys():
if abs(d1[key] - d2[key]) > TOL:
different = True
print "|{} - {}| > {}".format(d1[key], d2[key], TOL)
break
但我觉得这有点像是临时凑合的办法。
1 个回答
1
我觉得你的解决方案还不错,不过我会遍历一下d1和d2的键的交集,这样可以避免出现KeyError
错误。用一个lambda函数可能会让事情变得更简单一些。
d1 = {'a' : 1.001, 'b' : 2.0002, 'c' : 3}
d2 = {'a' : 1.002, 'b' : 2, 'c' : 3, 'd' : 4}
tol = 0.001
equals = lambda a, b: abs(a-b) < tol
# For loop with print
for key in set(d1.keys()) & set(d2.keys()):
print '{} == {} is {} (tolerance: {})'.format(
d1[key], d2[key], equals(d1[key], d2[key]), tol
)
# 1.001 == 1.002 is False (tolerance: 0.001)
# 3 == 3 is True (tolerance: 0.001)
# 2.0002 == 2 is True (tolerance: 0.001)
# List comprehension with bools
print [equals(d1[key], d2[key]) for key in set(d1.keys()) & set(d2.keys())]
# [False, True, True]