Python3:显示字典的键值对之间的差异

2024-06-01 02:18:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我想找出一个键有多个值的两个字典之间的区别。我发现的所有例子,字典都有一个只包含一个值的键。假设您有多个值的键,如下例所示:

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"]}

我只想返回两个字典中的差异,包括键和值。无论是披萨1还是披萨2的区别,哪本字典都无关紧要。下面是我要查找的示例:

^{pr2}$

我不确定它到底会如何输出,但想举个例子说明我在寻找什么。提前感谢您抽出时间帮忙!在

-杰夫


Tags: size字典例子thinsmallmediumlargedeep
3条回答

循环键的并集,处理值as sets并打印set difference

for key in pizza_1.keys() | pizza_2:  # union of the dict views
    difference = set(pizza_1.get(key, [])).difference(pizza_2.get(key, []))
    if difference:
        print(key, list(difference))

我在这里使用^{} dictionary view来提供字典键的联合。if测试过滤出空结果。在

如果您希望将其作为字典,则可以使用生成器表达式和dict理解来生成词典,以避免多次生成集合:

^{pr2}$

演示:

>>> for key in pizza_1.keys() | pizza_2:  # union of the dict views
...     difference = set(pizza_1.get(key, [])).difference(pizza_2.get(key, []))
...     if difference:
...         print(key, list(difference))
...
crust ['hand tossed']
toppings ['mushroom']
price ['$9.99', '$7.99', '$12.99']
>>> differences = ((key, list(set(pizza_1.get(key, [])).difference(pizza_2.get(key, []))))
...               for key in pizza_1.keys() | pizza_2)
>>> {k: v for k, v in differences if v}
{'crust': ['hand tossed'], 'toppings': ['mushroom'], 'price': ['$9.99', '$7.99', '$12.99']}

我所做的是遍历键并使用列表理解来获得差异(具体地说,pizza_1中的内容不在{}中,如示例输出所示)。在

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

我建议使用一个以设置值作为输出数据结构的字典。在

>>> {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'}}

结果将为没有差异的键保留一个空集(请参见大小)。在

相关问题 更多 >