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 根据您想要的确切逻辑实现比较,因此您可以通过为冰箱内容和每个食谱制作 Counters 并比较它们来使这变得非常简单:

>>> 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

使用您的输入词典 fridgerecipes 这两种方法可能会解决您的问题:

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