PYTHON:如果列表包含该键的所有值,如何 return 字典键

PYTHON: How to return a dictionary key if a list contains all values for that key

使用 python.

尝试制作一个食谱程序,告诉我可以根据当前的食材(清单)制作哪些餐点(关键)。

这是我的膳食字典,key是膳食,value是所需的食材:

breakfast = {
    "cerealBowl" : ["milk", "cereal"],
    "toast" : ["bread", "butter"],
    "eggsBacon" : ["eggs", "bacon"],
    "frenchToast" : ["bread", "eggs"]
}

这是我目前拥有的配料清单:

currentIngredients = ["milk", "bread", "rice", "butter", "eggs"]

如果所有值都在我当前的配料表中,我希望程序 return 我可以做的饭菜(关键)。

到目前为止我有:

def scanRecipes():
    for item in currentIngredients:

我不确定如何设置我的 next for loop/if 语句来迭代我的早餐字典值并将成分与我的当前成分列表进行比较。

希望获得类似于以下内容的输出:

"Meals available to make..." "toast" with ["bread", "butter"],"frenchToast" with ["bread", "eggs"]
currentIngredients = set(["milk", "bread", "rice", "butter", "eggs"])
for key,ing in breakfast.items():
    if currentIngredients.issuperset(set(ing)):
        print( "You can make", key )

遍历您的食谱字典并过滤到您拥有所有配料的食谱:

breakfast_recipes = {
    "cerealBowl" : ["milk", "cereal"],
    "toast" : ["bread", "butter"],
    "eggsBacon" : ["eggs", "bacon"],
    "frenchToast" : ["bread", "eggs"]
}

def get_recipes(ingredients):
    return {
        r: i for r, i in breakfast_recipes.items()
        if set(ingredients).issuperset(set(i))
    }

current_ingredients = ["milk", "bread", "rice", "butter", "eggs"]
print("Meals available to make...")
for r, i in get_recipes(current_ingredients).items():
    print(f"{r} with {i}")
Meals available to make...
toast with ['bread', 'butter']
frenchToast with ['bread', 'eggs']

可用餐点

对于 breakfast 中的每顿饭,您可以查看每种必需的成分是否在您的 currentIngredients 列表中:

available_meals = []
for meal, ingredients in breakfast.items():
    available_ingrs = 0
    for ingr in ingredients:
        if ingr in currentIngredients:
            available_ingrs += 1
    if available_ingrs == len(ingredients): #if all required ingredients were met
        available_meals.append((meal, ingredients))

其他答案更优雅,因为它们使用 issuperset 方法。 如果 A 包含 B 的所有元素,则称 A 是 B 的超集。 在这种情况下,如果 currentIngredients 包含 ingredients 的所有元素:

,则 currentIngredients 可能是 ingredients 的超集
set(currentIngredients).issuperset(ingredients) #returns a boolean

注意issuperset函数是set类型的方法。这就是为什么你必须将 currentIngredients 转换为 set.

打印输出

一个迭代 available_meals 列表的简单打印程序:

def printMeals():
    print("Meals available to make...")
    for elem in available_meals:
        print(repr(elem[0]), "with", elem[1])