我有两个字典,如下,我需要提取元组值中的哪些字符串在一个字典中但不在其他字典中:
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/