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