python - 将两个字典与满足多个条件的值列表进行比较
问题描述
我想比较两个具有以下值列表的字典:
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):
- dict1 中不存在的特定键的 dict2 值添加到 result_dict
- 如果 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。任何帮助将不胜感激
解决方案
如果您想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
.
推荐阅读
- asp.net-mvc-5 - 如何在 MVC5 中创建角色并分配给用户
- angular - 如何以最简单的方式将 Mat-Datepicker 日期格式更改为 DD/MM/YYYY?
- asp.net - 从中间件中排除控制器
- c# - 在 sitecore 9.0 中应该复制多少数据库(发布者、分发者、订阅者)?
- android - 使用 PJSIP 开源库进行 VoIP 媒体和信号处理
- c++ - 位图算法
- python - raw_input() 无法正确运行,因为语法分析器
- prestashop-1.7 - 如何将本地开发的 Prestashop 移动到托管服务器
- makefile - GNU 制作 | 如何在源代码层次结构和编译器输出 h-hy 之间创建依赖关系?
- python - 从字典创建字典列表