H. Кашееды — 4

Каждый воспитанник детского сада любит одну или несколько каш.
Поможем воспитателю составить список детей, которые любят конкретную кашу.

Формат ввода

В первой строке задаётся количество детей в группе (N). В следующих N строках записана фамилия ребенка и список его любимых каш. В последней строке записана каша, информацию о которой хочет получить воспитатель.

Формат вывода:

Фамилии учеников, которые любят заданную кашу, в алфавитном порядке.
Если таких не окажется, в строке вывода нужно написать «Таких нет».

Пример

Ввод

5
Васильев манная
Петров манная
Васечкин манная
Иванов овсяная
Михайлов овсяная
манная

Вывод

Васечкин
Васильев
Петров

Ввод

3
Иванов манная овсяная
Петров манная овсяная
Васечкин манная овсяная
гречневая

Вывод

Таких нет

Решение

Есть два подхода к решению задачи прямой, когда в словарь записывается имя кашееда в качестве ключа и обратный, когда в качестве ключа используется название каши. В первом подходе проще собрать словарь, во втором проще выдать правильный ответ.

Первый вариант. Собираем информацию о едоках в словарь, где ключ – имя кашееда, значения – каши, которые он ест.
Перебираем словарь по именам кашеедов. Если в соответствующей ячейке словаря упоминается нужная каша, запоминаем его в список.
Если список оказался пуст, то выводим сообщение о том, что кашеедов не найдено. В противном случае сортируем список и выводим его.

Второй вариант. Собираем информацию о кашах в словарь, где название каши – ключ, а имя кашееда – значение. Обратите внимание на то, что если в первом случае мы уверены, что ранее такое имя нам не встречалось и мы просто создаем запись в словаре, во втором случае словарь приходится собирать более аккуратно и другим способом – проверяя нет ли у нас уже такой записи.
после того как словарь собран нам остается просто проверить есть ли требуемая каша в словаре и если да, то вывести отсортированный список кашеедов.

Посмотреть код

Решение

Python
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)

Решение

Python
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('Таких нет')
Подписаться
Уведомить о
guest
5 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Данил
Данил
10.04.2024 09:11

eater, *porridges = string.split()
Что значит звёздочка в строке, перед “porridges”?

Последний раз редактировалось 8 месяцев назад Данил ем
Сергей
Сергей
22.05.2024 23:21

Решил так. Словарь с ключами в виде каш. Если каши нет в словаре, то такой ключ добавляется и к нему записывается в список имена едоков. Если есть, то просто по ключу пополняется список.

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(‘Таких нет’)

Saper06
Saper06
Ответить на  Сергей Клочко
23.05.2024 14:25

Я ещё про распаковку не знаю)) Только делаю первые шаги в освоении языка и программирования вообще.