繁体   English   中英

将两个字典与满足多个条件的值列表进行比较

[英]Compare two dictionaries with list of values which satisfies multiple conditions

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

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']}

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

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

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

如果您想在result_dict中保持与原始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']}

output dict 是由dict comprehension创建的。 基本上,我们 select 中的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中的相应列表作为值,如果键在不在dict1中,否则创建一个新列表(使用list comprehension )循环遍历 dict2 列表中的项目并删除dict2中对应列表中的项目(这将保留dict1中原始列表的dict2

您可以过滤掉任何值匹配的项目,然后在 dict 理解中,新键应该是相应键的set.difference

>>> {k:list(set(v).difference(dict1[k])) for k,v in dict2.items() if dict1[k] != v}
{'111': ['e@e.com'], '333': ['f@f.com'], '444': ['g@g.com']}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM