python - 提取 2 个给定字典的值的差异 - 值是字符串的元组

标签 python dictionary

我有两个字典,如下,我需要提取元组值中的哪些字符串在一个字典中但不在其他字典中:

dict_a = {"s": ("mmmm", "iiiii", "p11"), "yyzz": ("oo", "i9")}
dict_b = {"s": ("mmmm",), "h": ("pp",), "g": ("rr",)}

所需的输出:

{"s": ("iiiii", "p11"), "yyzz": ("oo", "i9")}

输出中字符串的顺序并不重要。

我尝试解决的一种方法,但它没有产生预期的结果:

>>> [item for item in dict_a.values() if item not in dict_b.values()]
[('mmmm', 'iiiii', 'p11'), ('oo', 'i9')]

最佳答案

如果顺序不重要,请将字典值转换为集合,然后减去它们:

{k: set(v) - set(dict_b.get(k, ())) for k, v in dict_a.items()}

上面从 dict_a 中获取所有键值对,并且对于每个这样的对,输出一个包含这些键的新字典和一个新值,该新值是原始值和相应值之间的设置差值来自 dict_b,如果有的话:

>>> dict_a = {"s": ("mmmm", "iiiii", "p11"), "yyzz": ("oo", "i9")}
>>> dict_b = {"s": ("mmmm",), "h": ("pp",), "g": ("rr",)}
>>> {k: set(v) - set(dict_b.get(k, ())) for k, v in dict_a.items()}
{'s': {'p11', 'iiiii'}, 'yyzz': {'oo', 'i9'}}

输出将有集合,但如果需要,可以将它们转换回元组:

{k: tuple(set(v) - set(dict_b.get(k, ()))) for k, v in dict_a.items()}

dict_b.get(k, ()) 调用可确保始终有一个元组提供给 set()

如果您使用 set.difference() 方法,您甚至不需要将 dict_b 值转换为集合:

{k: tuple(set(v).difference(dict_b.get(k, ()))) for k, v in dict_a.items()}

后两个选项的演示:

>>> {k: tuple(set(v) - set(dict_b.get(k, ()))) for k, v in dict_a.items()}
{'s': ('p11', 'iiiii'), 'yyzz': ('oo', 'i9')}
>>> {k: tuple(set(v).difference(dict_b.get(k, ()))) for k, v in dict_a.items()}
{'s': ('p11', 'iiiii'), 'yyzz': ('oo', 'i9')}

关于python - 提取 2 个给定字典的值的差异 - 值是字符串的元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73415744/

相关文章:

python - 来自 python 的 bash 命令

javascript - 基于 Javascript 字典的列表理解

python - 在 Python 字典中访问同级字典值的最有效方法是什么?

python - 比较运算符对字典有什么作用?

python - 如何从命令行导入我的 Django 应用程序模型?

python - Plotly:如何设置 x 轴上时间序列的主要刻度线/网格线的值?

python - 如何减少 for 循环创建字典的运行时间

python - 从局部变量创建 python 字典的最简洁方法

python - 如何在 Python 中创建一个对象数组?

python selenium无法找到存在的表ID