[英]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):
结果 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.