Вернёмся к условию, когда каждый воспитанник детского сада любит либо манную, либо овсяную, либо обе эти каши.
Напишите программу, которая позволит воспитателю узнать, какие дети любят только одну кашу.
Формат ввода
В первых двух строках указывается количество детей, любящих манную и овсяную каши (N и M).
Затем идут N+M строк — перемешанные фамилии детей.
Гарантируется, что в группе нет однофамильцев.
Формат вывода:
В алфавитном порядке фамилии учеников, которые любят только одну кашу.
Если таких не окажется, в строке вывода нужно написать «Таких нет».
Пример
Ввод
3
2
Васильев
Петров
Васечкин
Иванов
МихайловВывод
Васечкин
Васильев
Иванов
Михайлов
ПетровВвод
3
3
Иванов
Петров
Васечкин
Иванов
Петров
ВасечкинВывод
Таких нетРешение
Изменение относительно предыдущей задачи ровно одно — нам нужно вывести не количество детей, а их фамилии в алфавитном порядке.
Это значит, что нам достаточно изменить блок вывода данных в любом из используемых вариантов. Поэтому я привожу здесь только одно, классическое решение с помощью двух множеств.
Посмотреть код
Решение
# Фильтрация фамилий
list1size = int(input())
list2size = int(input())
list1 = set()
list2 = set()
for _ in range(list1size + list2size):
eater = input()
if eater in list1:
list2.add(eater)
else:
list1.add(eater)
# print(list1, list2)
if len(junction := (list1 ^ list2)) != 0:
for eater in sorted(junction):
print(eater)
else:
print('Таких нет')
Можете, пожалуйста, подсказать. Почему чекер не принимает такой вариант решения задачи:
semolina = int(input())
oatmeal = int(input())
seen = set()
duplicates = set()
for _ in range(semolina + oatmeal):
surname = input()
if surname in seen:
duplicates.add(surname)
else:
seen.add(surname)
if len(differences := (seen ^ duplicates)) != 0:
seen_list = list(seen)
seen_list.sort()
print(*seen_list, sep=’\n’)
else:
print(‘Таких нет’)
Тут простая невнимательность. Это самый обидный тип ошибки. Вы после differences := (seen ^ duplicates) используете seen_list = list(seen) и далее работаете с ним. Но правильные данные лежат в differences
я бы сделал что-то типа
semolina = int(input()) oatmeal = int(input()) seen = set() duplicates = set() for _ in range(semolina + oatmeal): surname = input() if surname in seen: duplicates.add(surname) else: seen.add(surname) differences = seen ^ duplicates if differences: for surname in sorted(differences): print(surname) else: print('Таких нет')Да, я сделал это намеренно, чтобы методом .sort отсортировать список и после вывести результат. Но ведь ответ получается верный, или в этом случае важно получить ответ используя множество? — т.е. чтобы именно во множестве differences были отсортированы фамилии в алфавитном порядке.
А кто мешает отсортировать differences? тут так и сделаено for surname in sorted(differences):
Да, я это понял, спасибо). Просто хотелось понять что именно не понравилось чекеру Яндекса, он выдал ошибку «WA» на 3 тесте)
я так понимаю, что все дело в том, что seen_list = list(seen) вы работаете со всеми кого встретили.
Я всё же добился своего)). Теперь чекер яндекса принимает мой код, в котором я методом .sort отсортировал список). Но, по какой причине он принял этот вариант кода, а тот нет — я не знаю), и понять не смог)
semolina = int(input()) oatmeal = int(input()) surname_list = set() for dishes in range(semolina + oatmeal): surname = input() if surname not in surname_list: surname_list.add(surname) else: surname_list.remove(surname) if len(surname_list): seen_list = list(surname_list) seen_list.sort() print(*seen_list, sep='\n') else: print('Таких нет')А что мешает отсортировать differences? тут так и сделаено <strong>for surname in sorted(differences):</strong>