Python 3:显示字典的键值对之间的差异
我想找出一个键有多个值的两个字典之间的区别。我找到的所有示例,字典都有一个只包含一个值的键。假设您的键具有多个值,如以下示例所示:Python 3:显示字典的键值对之间的差异,python,dictionary,Python,Dictionary,我想找出一个键有多个值的两个字典之间的区别。我找到的所有示例,字典都有一个只包含一个值的键。假设您的键具有多个值,如以下示例所示: pizza_1 = {"toppings": ["cheese", "pepperoni", "mushroom"], "crust": ["deep dish", "hand tossed", "
pizza_1 = {"toppings": ["cheese", "pepperoni", "mushroom"],
"crust": ["deep dish", "hand tossed", "thin"],
"size": ["large", "medium", "small"],
"price": ["$12.99", "$9.99", "$7.99"]}
pizza_2 = {"toppings": ["cheese", "pepperoni", "olive"],
"crust": ["deep dish", "traditional", "thin"],
"size": ["large", "medium", "small"],
"brand": ["Domino's", "Pizza Hut", "Little Caesars"]}
我只想返回两个字典中的差异,包括键和值。无论是pizza_1还是pizza_2的区别,哪本词典都无关紧要。下面是我正在寻找的示例:
print(differences)
"toppings": ["mushroom"]
"crust": ["hand tossed"]
"price": ["$12.99", "$9.99", "$7.99"]
我不确定它将如何输出,但我想给出一个例子,说明我在寻找什么。提前感谢您花时间提供帮助 我建议使用设置值作为输出数据结构的字典
>>> {k: set(v).difference(pizza_2.get(k, {})) for k, v in pizza_1.items()}
{'price': {'$9.99', '$7.99', '$12.99'}, 'size': set(), 'toppings': {'mushroom'}, 'crust': {'hand tossed'}}
结果将为一个没有差异的键保留一个空集(请参见大小)。我建议使用一个带有设置值的字典作为输出数据结构
>>> {k: set(v).difference(pizza_2.get(k, {})) for k, v in pizza_1.items()}
{'price': {'$9.99', '$7.99', '$12.99'}, 'size': set(), 'toppings': {'mushroom'}, 'crust': {'hand tossed'}}
结果将为没有差异的键保留一个空集(请参见大小)。循环键的并集,处理值并打印: 我使用here来提供字典键的并集。
if
测试过滤掉空结果
如果希望将其作为词典,可以生成一个带有生成器表达式和dict理解的词典,以避免多次生成集合:
differences = ((key, list(set(pizza_1.get(key, [])).difference(pizza_2.get(key, []))))
for key in pizza_1.keys() | pizza_2)
differences = {k: v for k, v in differences if v}
演示:
循环键的并集,处理值并打印: 我使用here来提供字典键的并集。
if
测试过滤掉空结果
如果希望将其作为词典,可以生成一个带有生成器表达式和dict理解的词典,以避免多次生成集合:
differences = ((key, list(set(pizza_1.get(key, [])).difference(pizza_2.get(key, []))))
for key in pizza_1.keys() | pizza_2)
differences = {k: v for k, v in differences if v}
演示:
我所做的是通过循环键并使用列表理解来获得差异(具体来说,
pizza_1
中的内容与您的示例输出所示的pizza_2
中的内容不同)
我所做的是通过循环键并使用列表理解来获得差异(具体来说,
pizza_1
中的内容与您的示例输出所示的pizza_2
中的内容不同)
钥匙总是一样的吗?如果没有,这些钥匙该怎么办?你好,Martijn,非常感谢你的帮助!从理论上讲,钥匙应该是一样的,但可能钥匙不一样。如果钥匙不一样,我想也有一个不同的显示。钥匙总是一样的吗?如果没有,这些钥匙该怎么办?你好,Martijn,非常感谢你的帮助!从理论上讲,钥匙应该是一样的,但可能钥匙不一样。如果键不相同,我也希望将其显示为差异。这在差异dict中提供了一个额外的
size:set()
元素这在差异dict中提供了一个额外的size:set()
元素。您能否以最简单的方式解释一下这里到底发生了什么。我还在学习python,字典是我需要更好理解的领域。对于pizza_1.keys()| pizza_2:#dict视图的并集difference=set(pizza_1.get(key,[])).difference(pizza_2.get(key,[])如果difference:print(key,list(difference))我不确定set()和get()在这里做什么。还有如何使用.difference(),因为该行等于difference变量。谢谢-Jeff@jmm5351:我曾尝试将您链接到相关文档(除了dict.get()
);阅读我包含的链接应该涵盖大部分内容;唯一缺少的链接是,它将返回给定键的值,或者如果该键丢失,则返回默认值。@jmm5351:pizza_1.keys()|pizza_2
为两个字典一起生成一组键,因此一个或另一个字典中的唯一键的组合dict.get()
检索该键的值,如果该字典中缺少该键,则检索空列表。然后,set(..).difference(..)
将取两个列表之间的差异。您能否以最简单的方式解释一下这里到底发生了什么。我还在学习python,字典是我需要更好理解的领域。对于pizza_1.keys()| pizza_2:#dict视图的并集difference=set(pizza_1.get(key,[])).difference(pizza_2.get(key,[])如果difference:print(key,list(difference))我不确定set()和get()在这里做什么。还有如何使用.difference(),因为该行等于difference变量。谢谢-Jeff@jmm5351:我曾尝试将您链接到相关文档(除了dict.get()
);阅读我包含的链接应该涵盖大部分内容;唯一缺少的链接是,它将返回给定键的值,或者如果该键丢失,则返回默认值。@jmm5351:pizza_1.keys()|pizza_2
为两个字典一起生成一组键,因此一个或另一个字典中的唯一键的组合dict.get()
检索该键的值,如果该字典中缺少该键,则检索空列表。设置(..).difference(..)
然后获取两个列表之间的差异。
def getDiff(dict1, dict2):
diff = {}
for key in dict1:
if key not in dict2:
diff[key] = dict1[key]
elif dict1[key] != dict2[key]:
diff[key] = [e for e in dict1[key] if e not in dict2[key]]
return diff