首页 > 解决方案 > 将两个字典与满足多个条件的值列表进行比较

问题描述

我想比较两个具有以下值列表的字典:

dict1 = {'111': [], '333': ['a@a.com'], '444': ['b@b.com', 'c@c.com'], '555': ['d@d.com']}
dict2 = {'111': ['e@e.com'], '333': ['f@f.com' ], '444': ['b@b.com', 'g@g.com'], '555': ['d@d.com']}

并创建满足以下条件的结果字典(result_dict):

  1. dict1 中不存在的特定键的 dict2 值添加到 result_dict
  2. 如果 dict1 和 dict2 的值相同,则不需要在 result_dict 中添加该键(例如,应跳过 555)

结果 dict 应如下所示:

   dict3 = {'1111': ['e@e.com'], '333': ['f@f.com'], '444': ['g@g.com']}

我有以下代码

    result_dict = {}
    for k,v in dict2.items():
        for k1,v1 in dict1.items():
            if k == k1 and v != v1:
               result_dict[k] = v


    print(result_dict)

哪个输出:

{'111': ['e@e.com'], '333': ['f@f.com'], '444': ['b@b.com', 'g@g.com']}

在上述情况下,它不应该'b@b.com'为 444 添加。如果订单被更改,它也会给出不正确的结果,例如

'444': ['b@b.com', 'c@c.com']
'444': ['c@c.com', 'b@b.com']

对 dict 值进行排序将无济于事,因为在某些情况下 dict1 的某些值比 dict2 的某些键值更多。我正在使用 Python 3.7。任何帮助将不胜感激

标签: pythonpython-3.x

解决方案


如果您想result_dict在原始字典中保持相同的顺序(dict2我的意思是):

result_dict = {
    k: v if k not in dict1 else [a for a in v if a not in dict1[k]]
    for k, v in filter(lambda x: len(set(x[1]).difference(dict1.get(x[0], []))), dict2.items())
}

这里result_dict

{'111': ['e@e.com'], '333': ['f@f.com'], '444': ['g@g.com']}

输出 dict 由dict comprehension创建。基本上,我们选择的键dict2的值是与 中的对应列表相比具有至少一个原始元素的列表dict1。然后,清除所选键的列表,删除也存在于dict1. 尤其是:

  • filter(lambda x: len(set(x[1]).difference(dict1.get(x[0], []))), dict2.items()) }: 仅循环dict2具有至少一个不在对应列表中的元素的键/列表对dict1
  • k: v if k not in dict1 else [a for a in v if a not in dict1[k]]在新 dict 中创建一个条目,其中的键dict2与对应列表中的值相同dict2,如果键不在 in 中dict1,则创建一个新列表(使用列表理解)循环列表中的项目dict2并删除那些也在中的通讯员列表dict1(这将保留dict2.

推荐阅读