Python 检查字典中的值是否对应于另一个字典中的值
Python check if value in dictionary corresponds to value in another one
我正在寻找一种解决方案,可以检查我可以根据冰箱中的食材制作给定列表中的哪些食谱。
所以“食谱”和“冰箱”都是字典。
我的脚本不考虑值,只考虑键。
我想找到一个只允许我找到结果“salade”的解决方案,因为这个脚本也会考虑这些值(食谱中的值必须等于或小于冰箱中的值)。
fridge = {
"orange" : 5,
"citron" : 3,
"sel" : 100,
"sucre" : 50,
"farine" : 250,
"lait" : 200,
"oeufs" : 1,
"tomates" : 6,
"huile" : 100,
}
recipes = {
"jus_de_fruit" : {
"orange" : 3,
"citron" : 1,
"pomme" : 1
},
"salade" : {
"tomates" : 4,
"huile" : 10,
"sel" : 3
},
"crepes" : {
"lait" : 400,
"farine" : 250,
"oeufs" : 2
}
}
def in_fridge(item):
if item in dictionnaire_frigo:
return True
else:
return False
def check_recipes(name):
for item in recipes[name]:
item_in_fridge = in_fridge(item)
if item_in_fridge == False:
return False
return True
for name in recipes:
print(check_recipes(name))
产出
假真真
if check_recipes(name) == True: print(name)
产出
沙拉和可丽饼
但我只想找到沙拉,因为我的冰箱里没有足够的配料“lait”,它不应该输出可丽饼
您可以使用
查看您有多少橘子
fridge["orange"] # Awnser : 5
以及使用
做可丽饼需要多少
recipes["crepes"]["lait"] # Awnser : 400
使用这两个命令,您应该能够进行所需的比较。
collections.Counter
根据您想要的确切逻辑实现比较,因此您可以通过为冰箱内容和每个食谱制作 Counter
s 并比较它们来使这变得非常简单:
>>> from collections import Counter
>>> for n, recipe in recipes.items():
... if Counter(recipe) <= Counter(fridge):
... print(n)
...
salade
如果出于某种原因需要在没有 Counter
的情况下实现它,迭代 recipe
中的项目并将每个项目与冰箱中的数量进行比较非常简单(这完全相同Counter(recipe) <= Counter(fridge)
在幕后做的事情:
>>> for n, recipe in recipes.items():
... if all(c <= fridge.get(i, 0) for i, c in recipe.items()):
... print(n)
...
salade
使用您的输入词典 fridge
和 recipes
这两种方法可能会解决您的问题:
def in_fridge(ingredients: dict, fridge_food: dict) -> bool:
for ingredient in ingredients:
if ingredient not in fridge_food:
return False
if ingredients[ingredient] > fridge_food[ingredient]:
return False
return True
def check_recipes(recipes: dict, fridge_food: dict) -> None:
for recipe in recipes:
if in_fridge(recipes[recipe], fridge_food):
print(f'There are enough ingredients to make {recipe}. ')
将它们与您的词典一起使用
if __name__ == '__main__':
check_recipes(recipes, fridge)
输出:
There are enough ingredients to make salade.
如果您愿意,可以列出您可以做的食谱,请改用:
def check_recipes(recipes: dict, fridge_food: dict) -> list:
ans = []
for recipe in recipes:
if in_fridge(recipes[recipe], fridge_food):
ans.append({recipe: recipes[recipe]})
return ans
那么输出就是
[{'salade': {'tomates': 4, 'huile': 10, 'sel': 3}}]
简单地迭代和比较(首先找到匹配的键,然后找到值)。
只要做:
for recipe, recipe_contents in recipes.items():
if all(elem in list(fridge.keys()) for elem in list(recipes[recipe].keys())):
if all(recipe_contents[elem] <= fridge[elem] for elem in recipe_contents):
print(recipe)
结果是:
salade
def in_fridge(item):
return item[0] in fridge.keys() and item[1] <= fridge[item[0]]
def check_recipes(name):
for item in recipes[name].items():
if not in_fridge(item):
return False
return True
for name in recipes.keys():
print(check_recipes(name))
False
True
False
我正在寻找一种解决方案,可以检查我可以根据冰箱中的食材制作给定列表中的哪些食谱。 所以“食谱”和“冰箱”都是字典。
我的脚本不考虑值,只考虑键。 我想找到一个只允许我找到结果“salade”的解决方案,因为这个脚本也会考虑这些值(食谱中的值必须等于或小于冰箱中的值)。
fridge = {
"orange" : 5,
"citron" : 3,
"sel" : 100,
"sucre" : 50,
"farine" : 250,
"lait" : 200,
"oeufs" : 1,
"tomates" : 6,
"huile" : 100,
}
recipes = {
"jus_de_fruit" : {
"orange" : 3,
"citron" : 1,
"pomme" : 1
},
"salade" : {
"tomates" : 4,
"huile" : 10,
"sel" : 3
},
"crepes" : {
"lait" : 400,
"farine" : 250,
"oeufs" : 2
}
}
def in_fridge(item):
if item in dictionnaire_frigo:
return True
else:
return False
def check_recipes(name):
for item in recipes[name]:
item_in_fridge = in_fridge(item)
if item_in_fridge == False:
return False
return True
for name in recipes:
print(check_recipes(name))
产出
假真真
if check_recipes(name) == True: print(name)
产出
沙拉和可丽饼
但我只想找到沙拉,因为我的冰箱里没有足够的配料“lait”,它不应该输出可丽饼
您可以使用
查看您有多少橘子fridge["orange"] # Awnser : 5
以及使用
做可丽饼需要多少recipes["crepes"]["lait"] # Awnser : 400
使用这两个命令,您应该能够进行所需的比较。
collections.Counter
根据您想要的确切逻辑实现比较,因此您可以通过为冰箱内容和每个食谱制作 Counter
s 并比较它们来使这变得非常简单:
>>> from collections import Counter
>>> for n, recipe in recipes.items():
... if Counter(recipe) <= Counter(fridge):
... print(n)
...
salade
如果出于某种原因需要在没有 Counter
的情况下实现它,迭代 recipe
中的项目并将每个项目与冰箱中的数量进行比较非常简单(这完全相同Counter(recipe) <= Counter(fridge)
在幕后做的事情:
>>> for n, recipe in recipes.items():
... if all(c <= fridge.get(i, 0) for i, c in recipe.items()):
... print(n)
...
salade
使用您的输入词典 fridge
和 recipes
这两种方法可能会解决您的问题:
def in_fridge(ingredients: dict, fridge_food: dict) -> bool:
for ingredient in ingredients:
if ingredient not in fridge_food:
return False
if ingredients[ingredient] > fridge_food[ingredient]:
return False
return True
def check_recipes(recipes: dict, fridge_food: dict) -> None:
for recipe in recipes:
if in_fridge(recipes[recipe], fridge_food):
print(f'There are enough ingredients to make {recipe}. ')
将它们与您的词典一起使用
if __name__ == '__main__':
check_recipes(recipes, fridge)
输出:
There are enough ingredients to make salade.
如果您愿意,可以列出您可以做的食谱,请改用:
def check_recipes(recipes: dict, fridge_food: dict) -> list:
ans = []
for recipe in recipes:
if in_fridge(recipes[recipe], fridge_food):
ans.append({recipe: recipes[recipe]})
return ans
那么输出就是
[{'salade': {'tomates': 4, 'huile': 10, 'sel': 3}}]
简单地迭代和比较(首先找到匹配的键,然后找到值)。 只要做:
for recipe, recipe_contents in recipes.items():
if all(elem in list(fridge.keys()) for elem in list(recipes[recipe].keys())):
if all(recipe_contents[elem] <= fridge[elem] for elem in recipe_contents):
print(recipe)
结果是:
salade
def in_fridge(item):
return item[0] in fridge.keys() and item[1] <= fridge[item[0]]
def check_recipes(name):
for item in recipes[name].items():
if not in_fridge(item):
return False
return True
for name in recipes.keys():
print(check_recipes(name))
False
True
False