python:将字典与缺少项目的 return keyError 进行比较

python: Compare Dictionaries to return keyError on missing item

我正在尝试比较两个字典,期望的结果是一个 KeyError,它标识丢失的键。

这是我目前拥有的:

d1 = {'lion': 10.0}
d2 = {'lion': 10, 'tiger': 3}

def calc_test(d1, d2):
    if set(d2) <= set(d1) == True:
        pass
    else:
        raise KeyError(set(d2))

 
calc_test(d1,d2)

如果你运行虽然它给出了整个字典的输出:

KeyError: {'lion', 'tiger'}

我正在寻找的是只显示丢失密钥的输出:

KeyError: {'tiger'}

使用差分运算符,set(d2)-set(d1)

d1 = {'lion': 10.0}
d2 = {'lion': 10, 'tiger': 3}

def calc_test(d1, d2):
    if set(d2) <= set(d1) == True:
        pass
    else:
        raise KeyError(set(d2)-set(d1))

try:
    calc_test(d1,d2)
except Exception as e:
    print(e)

这将显示 d2 中不在 d1 中的键。

如果您使用集合,可以使用一个名为 symmetric_difference 的简单函数来查找两个集合中的不常见值。

set(d2).symmetric_difference(set(d1))

这会给你结果: {'tiger'}

所以你可以这样修改你的函数:

d1 = {'lion': 10.0}
d2 = {'lion': 10, 'tiger': 3}

def calc_test(d1, d2):
    uncommon_items = set(d2).symmetric_difference(set(d1))
    if len(uncommon_items) > 0:
        raise KeyError(uncommon_items)

calc_test(d1, d2)

尝试 difference:

d1 = {'lion': 10.0}
d2 = {'lion': 10, 'tiger': 3}

def calc_test(d1, d2):
    if set(d2) <= set(d1) == True:
        pass
    else:
        raise KeyError(set(d2).difference(set(d1)))

 
calc_test(d1,d2)

只需检查 d2 中的键在 d1 中:

def calc_test(d1, d2):
    s = []
    for i in d2:
        if i not in d1:
            s.append(i)
    if s:
        raise(KeyError(s))
# Raises
KeyError: ['tiger']

请注意,如果 d1 中有一个不在 d2

中的键,这将不起作用

虽然它的长度更长,但它在时间上和 space 复杂度上都很高效。