比较两个字典并将识别的键和值差异添加到新字典
Posted
技术标签:
【中文标题】比较两个字典并将识别的键和值差异添加到新字典【英文标题】:Compare two dictionaries and add the identified key and difference in value to a new dict 【发布时间】:2021-05-22 23:16:45 【问题描述】:我有两本字典,我正在尝试使用 For 循环与 If 条件混合来实现以下目标。
-
对于 meal_recipe 中的每个“项目”,检查项目是否在储藏室中。
如果是,请检查meal_recipe 的“价值”是否大于食品储藏室。如果是,则在 shopping_list 中添加键 + 差值。
如果没有,请将 meal_recipe 的 Key 和 value 都添加到 shopping_list 中。
meal_recipe = 'pasta': 2, 'garlic': 2, 'sauce': 3,
'basil': 4, 'salt': 1, 'pepper': 2,
'olive oil': 2, 'onions': 2, 'mushrooms': 6
pantry = 'pasta': 3, 'garlic': 4,'sauce': 2,
'basil': 2, 'salt': 3, 'olive oil': 3,
'rice': 3, 'bread': 3, 'peanut butter': 1,
'flour': 1, 'eggs': 1, 'onions': 1, 'mushrooms': 3,
'broccoli': 2, 'butter': 2,'pickles': 6, 'milk': 2,
'chia seeds': 5
我是 python 中的菜鸟,所以到目前为止我一直停留在下面的代码中,不知道如何继续:
for item, stock in meal_recipe.items():
if item in pantry:
if mean_recipe [stock] > pantry [stock]: ????? Not sure
Shopping_list=item for item in mean_recipe ????? Not sure
谁能告诉我应该怎么做?
【问题讨论】:
第一步:让缩进正确。 Python 需要这个。meal_recipe
和 pantry
是什么?不应该是Dict1
和Dict2
吗?
指令说“对于 dict2 中的每个项目”。你为什么要循环Dict1.items()
?不应该是Dict2.items()
吗?
如果你使用变量meal_recipe
、pantry
和shopping_list
而不是像Dict1
和Dict2
这样无意义的名字,实际上会更容易理解。
"如果没有,请将 meal_recipe 的 Key 和 value 添加到 shopping_list。"好吧,如果你想添加一些东西到shopping_list
,它应该首先存在,对吧?然后,想想添加它所涉及的内容。
【参考方案1】:
stock
不是字典键,它是来自meal_recipe
的值。密钥是item
。所以你应该使用pantry[item]
,而不是pantry[stock]
。
您可以使用dict.get()
方法,而不是显式检查该项目是否在字典中,该方法允许您指定默认值。这样,您可以将不在字典中的项目视为数量为 0,这将始终小于您需要的数量。
for ingredient, qty_needed in meal_recipe.items():
qty_in_pantry = pantry.get(ingredient, 0)
if qty_needed > qty_in_pantry:
shopping_list[ingredient] = qty_needed - qty_in_pantry
如果购物清单可能已经有商品,您可能想增加购买数量,您也可以在那里使用.get()
:
shopping_list[ingredient] = shopping_list.get(ingredient, 0) + qty_needed - qty_in_pantry
【讨论】:
我什至会更进一步,将 dict 键变量重命名为“item”-->“ingredient”。当您使用 .items() 方法时,它会使事情变得混乱。 @LastTigerEyes 好主意,我在更新答案时更改了它以停止提及 Dict1 和 Dict2。 嗨,Barmar,感谢您的洞察力。我会试试这个。 @Barmar,我认为你的代码有一个小错误。qty_in_pantry = pantry.get(ingredient, 0):
最后不需要冒号,因为它是一个赋值,这意味着接下来的两行可以不缩进。
@LastTigerEyes 谢谢。这是早期版本遗留下来的另一个 if 以上是关于比较两个字典并将识别的键和值差异添加到新字典的主要内容,如果未能解决你的问题,请参考以下文章
使用 for loop .splitlines 循环将键和值添加到字典