比较两个词典,删除一个词典中的键/值对,如果它存在于另一个词典中

时间:2017-02-17 00:05:46

标签: python python-3.x dictionary duplicates

我有两本词典。一个看起来像这样:

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唯一的唯一元素{/ 1>} dict1中不存在,并且看起来像:

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

我不需要做任何关于莎拉在dict1的事情。我只关心将dict2dict1进行比较以删除重复项。

额外信息:

我尝试以多种不同的方式循环使用dicts,但它给了我两种类型的错误:not hashable typedict content changed during action

我还尝试将每个列表组合在一起并组合列表,但最终结果是另一个列表,我不知道如何将列表转换回字典。

4 个答案:

答案 0 :(得分:4)

如果密钥匹配,

Jim's answer会删除项目。如果密钥值匹配,我想您想删除。这实际上非常简单,因为您使用的是Python 3:

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

它起作用,因为dict_items个对象将减法操作视为设置差异。

答案 1 :(得分:1)

如果有人在寻找python 2.x的解决方案(因为我一直在寻找),那么答案就在这里:

dict(filter(lambda x: x not in dict2.items(), dict1.items()))

答案 2 :(得分: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)

产生类似的结果。

答案 3 :(得分:0)

这只是查找dict1中dict2中的所有键,然后从dict2中删除键/值对。

for key in dict1:
    if key in dict2 and (dict1[key] == dict2[key]):
        del dict2[key]

锄头有帮助!