Функция, которая проверяет, совпадают ли значения в списке со списками конкретных значений в словаре?

Я хочу сделать функцию, которая принимает список строк и словарь в качестве входных данных. Если какие-либо строки в списке соответствуют набору значений в словаре, они должны возвращать ключ, соответствующий этим значениям.

Пример ввода будет выглядеть примерно так available_dishes(ingredients, recipes). Где

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

Поскольку в списке есть только необходимые ингредиенты для жареной рыбы и омуриса, это вернет вывод: ['Grilled_Fish','Omurice']. В частности, результаты должны отображаться в том порядке, в котором ключи появляются в словаре.

Что я пытаюсь

В своей попытке я выделил один из списков в списке значений словаря. Я попытался сосредоточиться на одном списке, чтобы понять, как могут функционировать остальные. То, что я сделал, — это не обязательно функция, а группа переменных, которую я хотел интерпретировать.

recipe_ingredients = list(recipes.values())

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

К сожалению, на данный момент мои знания о python ограничены, поэтому возвращаются только совпадающие ингредиенты из двух списков: Fish Rice. У меня еще немного опыта работы с циклами for, поэтому я хотел бы посмотреть, как это можно сделать, используя их, а также операторы if.Если возможно, можно ли это сделать без использования понимания списка?

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
2
0
22
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать 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']

Без понимания списка:

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

Другие вопросы по теме