我有一本字典:
meals = {'Pasta Bolognese' : ['pasta', 'tomato sauce', 'ground beef'],
'Cold Salad' : ['greens', 'tomato'],
'Warm Salad' : ['greens', 'tomato', 'corn', 'chickpeas', 'quinoa'],
'Sandwich' : ['bread', 'turkey slices', 'cheese', 'sauce']}
和一个列表:
ingredients = ['bread', 'chickpeas', 'tomato', 'greens']
我想从字典中获得一个键,如果它的所有值都存在于列表中。因此,在当前情况下,我想要"冷沙拉",因为"绿色"one_answers"西红柿"都在列表中。
您可以使用:
>>> next((k for k, v in meals.items() if set(v).issubset(ingredients)))
'Cold Salad'
>>>
请注意,这段代码使用了next
的生成器,也有一个更有效的方式来拥有多个in
语句,而不是all
和in
的循环,我使用set.issubset
来检查一个集合中的所有值是否为另一个集合的子集。
如果没有匹配,在末尾添加None
:
next((k for k, v in meals.items() if set(v).issubset(ingredients)), None)
或者任何东西,你可以用任何东西代替None
,例如"No Match"
。
可以这样使用列表推导式:
meals = {'Pasta Bolognese' : ['pasta', 'tomato sauce', 'ground beef'],
'Cold Salad' : ['greens', 'tomato'],
'Warm Salad' : ['greens', 'tomato', 'corn', 'chickpeas', 'quinoa'],
'Sandwich' : ['bread', 'turkey slices', 'cheese', 'sauce'],
'Another Item': ['greens', 'bread']}
ingredients = ['bread', 'chickpeas', 'tomato', 'greens']
output = [key for key, value in meals.items() if set(value).issubset(ingredients)]
print(output)
结果:
['Cold Salad', 'Another Item']
您将注意到我添加了Another Item
来测试是否返回多个匹配项。