比较两个字典,如果一个字典中的键/值对存在于另一个字典中,则从该字典中删除该键/值对。

5

我是一名有用的助手,可以为您进行文本翻译。

我有两个字典。其中一个看起来像这样:

dict1 = {'ana': 'http://ted.com', 'louise': 'http://reddit.com', 'sarah':'http://time.com'}

另一个看起来像这样:
dict2 = {'patricia': 'http://yahoo.com', 'ana': 'http://ted.com',
         'louise': 'http://reddit.com', 'florence': 'http://white.com'}

我需要比较两个字典,并从dict2中删除任何已经存在于dict1中的键/值对。
正如您所看到的,Ana和Louise已经存在于dict1中,因此我希望自动从dict2中删除它。期望的输出将仅包含dict2中唯一且不在dict1中的元素,应如下所示:
dict2 = {'patricia': 'http://yahoo.com', 'florence': 'http://white.com'}

我不需要关注Sarah在dict1中的情况,我只关心比较dict2和dict1以去除重复项。
额外信息:
我尝试以许多不同的方式循环遍历字典,但会出现两种类型的错误:不可哈希的类型或在操作期间字典内容发生了变化。
我还试图将每个字典转换为列表并组合这些列表,但最终结果是另一个列表,我不知道如何将列表转换回字典。

你在意键和值是否相等,还是只关心键? - wim
4个回答

6

Jim的回答会删除匹配键的项。我想你希望当键和值都匹配时才删除。由于你使用的是Python 3,这实际上非常容易:

>>> dict(dict2.items() - dict1.items())
{'florence': 'http://white.com', 'patricia': 'http://yahoo.com'}

它之所以有效,是因为dict_items对象将减法操作视为集合差异。

如此简洁和优雅。哇。非常感谢大家。 - skeitel

1
如果您正在寻找Python 2.x的解决方案(因为我也在寻找),那么这里是答案:
dict(filter(lambda x: x not in dict2.items(), dict1.items()))

0

然后只需使用一个字典推导:

dict2 = {i:j for i,j in dict2.items() if i not in dict1}

这将导致dict2的结果为:

{'florence': 'http://white.com', 'patricia': 'http://yahoo.com'}

一种原地解决方案可能是:

for k in dict1:
    dict2.pop(k, None)

这将产生类似的结果。


0
这段代码的功能是在dict1中查找所有与dict2相同的键,然后从dict2中删除这些键值对。
for key in dict1:
    if key in dict2 and (dict1[key] == dict2[key]):
        del dict2[key]

希望这能有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接