打印可用的并显示两个词典中缺少的项目

Print available and show missing items from two dictionaries

我的冰箱里有一本字典,其中包含我可用的食物,我想打印我可以制作的食谱,以及如果我有足够的物品(显示缺少的物品数量)我可以制作的食谱并打印缺少成分的那些,因此它是什么成分。 我只是设法把它们全部展示出来。

fridge = {
    "orange" : 5,
    "citron" : 3,
    "sel" : 100,
    "sucre" : 50,
    "farine" : 250,
    "tomates" : 6,
    "huile" : 100,
    "pomme" : 1,
    "lait" : 1,
    "pois chiche" : 1,
}
    
recipes = {
    "jus_de_fruit" : {
        "orange" : 3,
        "citron" : 1,
        "pomme" : 2
    },
    "salad" : {
        "tomates" : 4,
        "huile" : 10,
        "sel" : 3
    },
    "crepes" : {
        "lait" : 1,
        "farine" : 250,
        "oeufs" : 2
        
    },
    "glace" : {
        "bac a glace" : 1,
        "coulis abricot" : 1,
        "batonnet" : 1
        }
    }

recette_dispo=[]
counter = 0
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(f'\n \n ****   nice! you can make this recipe : {recipe}  ****')
            counter += 1 
            recette_dispo=recipe
        else : 
            print(f'You have all ingredients but not enough in quantity for: {recipe}, you need: {list(recipe_contents.items())}')           
  
     else :         
            print(f'\n\n Tu nas pas tous les ingrédients pour : {recipe}')
            print(f' You need these ingredients in order to make it  : {list(recipe_contents.items())}')
            

            
            
print("\n I can make in total", counter, "recipe(s) from the ingredients in my fridge:",recette_dispo)

输出:

You have all ingredients but not enough in quantity for: jus_de_fruit, you need:[('orange', 3), ('citron', 1), ('pomme', 2)]
#here I would like instead only the missing numbers of ingredients

     ****  nice! you can make this recipe : salad  ****
    
    
    You don't have all ingredients for: crepes
    You need these ingredients : [('lait', 1), ('farine', 250), ('oeufs', 2)]
#here I would like instead not all the ingredients of the recipe but only the ones missing in my fridge
    
    
     Tu nas pas tous les ingrédients pour : glace
     You need these ingredients: [('bac a glace', 1), ('coulis abricot', 1), ('batonnet', 1)]
    
     I can make in total 1recipe(s) from the ingredients in my fridge: salade

您可以使用此示例来查找冰箱中丢失的物品:

fridge = {
    "orange": 5,
    "citron": 3,
    "sel": 100,
    "sucre": 50,
    "farine": 250,
    "tomates": 6,
    "huile": 100,
    "pomme": 1,
    "lait": 1,
    "pois chiche": 1,
}

recipes = {
    "jus_de_fruit": {"orange": 3, "citron": 1, "pomme": 2},
    "salad": {"tomates": 4, "huile": 10, "sel": 3},
    "crepes": {"lait": 1, "farine": 250, "oeufs": 2},
    "glace": {"bac a glace": 1, "coulis abricot": 1, "batonnet": 1},
}

for recipe_name, ingredients in recipes.items():
    print(f"Recipe: {recipe_name}")
    if (missing := ingredients.keys() - fridge.keys()) :
        print("Missing ingredients:", missing)
    else:
        common = {
            k: fridge[k] - ingredients[k]
            for k in ingredients.keys() & fridge.keys()
        }

        if all(v >= 0 for v in common.values()):
            print("All ingredients are OK")
        else:
            for i, v in common.items():
                if v < 0:
                    print(f"Ingredient {i}: missing {-v} items")
    print("-" * 80)

打印:

Recipe: jus_de_fruit
Ingredient pomme: missing 1 items
--------------------------------------------------------------------------------
Recipe: salad
All ingredients are OK
--------------------------------------------------------------------------------
Recipe: crepes
Missing ingredients: {'oeufs'}
--------------------------------------------------------------------------------
Recipe: glace
Missing ingredients: {'batonnet', 'coulis abricot', 'bac a glace'}
--------------------------------------------------------------------------------

几年前我尝试实现类似的东西(用汇编语言),但作为采购代理(前世)并没有为我提供更新冰箱库存所需的勤奋程度,香料架等,因为我正在使用我的配料。番茄酱、沙拉酱、橄榄和泡菜片等东西不适合 bean-counting。库存管理应针对食品储藏室和冰柜,应避免在冰箱层面进行。

这只是我的意见,但如果我们考虑到这一点并更多地依赖人为因素,我们可以通过使用 sets:

使程序的主要机制更加优雅
frigo = {
    "orange" : 5,
    "citron" : 3,
    "sel" : 100,
    "sucre" : 50,
    "farine" : 250,
    "tomates" : 6,
    "huile" : 100,
    "pomme" : 1,
    "lait" : 1,
    "pois chiche" : 1,
}

recettes = {
    "jus_de_fruit" : {
        "orange" : 3,
        "citron" : 1,
        "pomme" : 2
    },
    "salad" : {
        "tomates" : 4,
        "huile" : 10,
        "sel" : 3
    },
    "crepes" : {
        "lait" : 1,
        "farine" : 250,
        "oeufs" : 2
        
    },
    "glace" : {
        "bac a glace" : 1,
        "coulis abricot" : 1,
        "batonnet" : 1
        }
    }

frigoSet = set(frigo)
peutFaire = []
nePeutPasFaire = dict()

for recette in recettes:
    recetteSet = set(recettes[recette])
    recetteSet.difference_update(frigoSet)
    if len(recetteSet) == 0:
        peutFaire.append(recette)
    else:
        nePeutPasFaire.update({recette: list(recetteSet)})

print("Vous avez les ingrédients pour faire:")
for i in peutFaire:
    print("   {}".format(i))

print("\nIl manque des ingrédients pour les recettes suivantes:")
for i in nePeutPasFaire:
    print("   {}".format(i))
    for j in nePeutPasFaire[i]:
        print("      {}".format(j))

程序的输出是:

Vous avez les ingrédients pour faire:
   jus_de_fruit
   salad

Il manque des ingrédients pour les recettes suivantes:
   crepes
      oeufs
   glace
      coulis abricot
      bac a glace
      batonnet

然后您可以使用您的 个人 冰箱里的东西的知识来决定您想要做什么。毕竟,你今天早上可能决定不做薄饼,因为你想把剩下的几个鸡蛋留到明天做肉汤。

这只是为了让您了解如何使用集合来获取基本信息,而无需从一开始就对每个食谱中的每种成分进行大量比较。