在Python中优雅地比较两个字典中的元素是否在容忍范围内

0 投票
1 回答
599 浏览
提问于 2025-04-18 02:26

假设我有这两个字典:

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]

撰写回答