Каждый воспитанник детского сада любит одну или несколько каш.
Поможем воспитателю составить список детей, которые любят конкретную кашу.
Формат ввода
В первой строке задаётся количество детей в группе (N). В следующих N строках записана фамилия ребенка и список его любимых каш. В последней строке записана каша, информацию о которой хочет получить воспитатель.
Формат вывода:
Фамилии учеников, которые любят заданную кашу, в алфавитном порядке.
Если таких не окажется, в строке вывода нужно написать «Таких нет».
Пример
Ввод
5
Васильев манная
Петров манная
Васечкин манная
Иванов овсяная
Михайлов овсяная
манная
Вывод
Васечкин
Васильев
Петров
Ввод
3
Иванов манная овсяная
Петров манная овсяная
Васечкин манная овсяная
гречневая
Вывод
Таких нет
Решение
Есть два подхода к решению задачи прямой, когда в словарь записывается имя кашееда в качестве ключа и обратный, когда в качестве ключа используется название каши. В первом подходе проще собрать словарь, во втором проще выдать правильный ответ.
Первый вариант. Собираем информацию о едоках в словарь, где ключ – имя кашееда, значения – каши, которые он ест.
Перебираем словарь по именам кашеедов. Если в соответствующей ячейке словаря упоминается нужная каша, запоминаем его в список.
Если список оказался пуст, то выводим сообщение о том, что кашеедов не найдено. В противном случае сортируем список и выводим его.
Второй вариант. Собираем информацию о кашах в словарь, где название каши – ключ, а имя кашееда – значение. Обратите внимание на то, что если в первом случае мы уверены, что ранее такое имя нам не встречалось и мы просто создаем запись в словаре, во втором случае словарь приходится собирать более аккуратно и другим способом – проверяя нет ли у нас уже такой записи.
после того как словарь собран нам остается просто проверить есть ли требуемая каша в словаре и если да, то вывести отсортированный список кашеедов.
Посмотреть код
Решение
porridge_eaters = {}
for _ in range(int(input())):
string = input()
eater, *porridges = string.split()
porridge_eaters[eater] = porridges
porridge = input()
names = []
for name in porridge_eaters:
if porridge in porridge_eaters[name]:
names.append(name)
if not names:
print('Таких нет')
else:
names.sort()
for name in names:
print(name)
Решение
porridges_list = {}
for _ in range(int(input())):
string = input()
eater, *porridges = string.split()
for porridge in porridges:
porridges_list[porridge] = porridges_list.get(porridge, []) + [eater]
porridge = input()
if porridge in porridges_list:
print('\n'.join(sorted(porridges_list[porridge])))
else:
print('Таких нет')
eater, *porridges = string.split()
Что значит звёздочка в строке, перед “porridges”?
Это называется “распаковка”. Первое значение попадет в первую переменную, а все остальные во вторую.
Осталось в решении по невнимательности.
Его прямой аналог –
Решил так. Словарь с ключами в виде каш. Если каши нет в словаре, то такой ключ добавляется и к нему записывается в список имена едоков. Если есть, то просто по ключу пополняется список.
porridges = dict()
for _ in range(int(input())):
text = input().split()
for porridge in text[1:]:
porridges[porridge] = porridges.get(porridge, []) + [text[0]]
porridge = input()
if porridge in porridges:
spis = porridges[porridge]
spis.sort()
for name in spis:
print(name)
else:
print(‘Таких нет’)
единственная претензия к вашему решению состоит в том, что нет необходимости использовать text[0] и text[1:], удобнее распаковать это в name, *porridges = text
Я ещё про распаковку не знаю)) Только делаю первые шаги в освоении языка и программирования вообще.