检查列表中的值是否与字典中的特定值列表相同的函数?

Function that checks if values in a list are the same as specific value lists in a dictionary?

我想制作一个将字符串列表和字典作为输入的函数。如果列表中的任何字符串与字典中的一组值匹配,它们应该 return 一个与这些值对应的键。

示例输入类似于 available_dishes(ingredients, recipes)。其中

ingredients = ['Fish','Rice','Eggs','Ketchup']
recipes = {'Sushi':['Fish','Rice','Seaweed'],'Grilled_Fish':['Fish'],'Omurice':['Eggs','Rice','Ketchup']}

因为列表中只有烤鱼和蛋包饭的必要成分,这将 return 输出:['Grilled_Fish','Omurice']。具体来说,结果应按照键在字典中出现的顺序出现。

我在尝试什么

在我的尝试中,我分离了字典值列表中的一个列表。我试着专注于一个列表,这样我就可以了解其余列表的功能。我所做的不一定是一个函数,而是一组我想尝试解释的变量。

recipe_ingredients = list(recipes.values())

for i in ingredients:
    if i in recipe_ingredients[0]:
        print(i)

不幸的是,目前我对 python 的了解有限,因此这只是 return 两个列表之间的匹配成分:Fish Rice我对 for 循环还不太熟悉,所以我想看看如何使用它们以及 if 语句来完成此操作。 如果可能的话,这个可以吗在不使用列表理解的情况下完成?

您可以使用all()检查食谱是否有所有种可用成分:

ingredients = ["Fish", "Rice", "Eggs", "Ketchup"]
recipes = {
    "Sushi": ["Fish", "Rice", "Seaweed"],
    "Grilled_Fish": ["Fish"],
    "Omurice": ["Eggs", "Rice", "Ketchup"],
}

out = [k for k, v in recipes.items() if all(i in ingredients for i in v)]
print(out)

打印:

['Grilled_Fish','Omurice']

没有list-comprehension:

out = []
for k, v in recipes.items():
    if all(i in ingredients for i in v):
        out.append(k)

print(out)

集是你的朋友。它们是独特项目的无序集合,例如食谱的成分。首先我把你的列表变成了集合:

my_ingredients = {'Fish', 'Rice', 'Eggs', 'Ketchup'}
recipes = {'Sushi': {'Fish', 'Rice', 'Seaweed'},'Grilled_Fish': {'Fish'}, 'Omurice': {'Eggs',  'Rice', 'Ketchup'}}

然后您可以检查食谱的成分是否是您的成分的一部分。下面是如何在列表理解中使用该条件:

>>> [food for food, ingredients in recipes.items() if ingredients.issubset(my_ingredients)]
['Grilled_Fish', 'Omurice']