Изменим задачу и напишем программу, которая поможет быстро выяснить, сколько детей любят только одну кашу.
Формат ввода
В первых двух строках указывается количество детей, любящих манную и овсяную каши (N и M).
Затем идут N+M строк — перемешанные фамилии детей.
Гарантируется, что в группе нет однофамильцев.
Формат вывода:
Количество учеников, которые любят только одну кашу.
Если таких не окажется, в строке вывода нужно написать «Таких нет».
Пример
Ввод
3
2
Васильев
Петров
Васечкин
Иванов
Михайлов
Вывод
5
Ввод
3
3
Иванов
Петров
Васечкин
Иванов
Петров
Васечкин
Вывод
Таких нет
Решение
Основная трудность заключается в том, что списки без особого предупреждения становятся ПЕРЕМЕШАННЫМИ. Это означает, что пример два мог бы выглядеть совсем по-другому:
3
3
Иванов
Иванов
Петров
Петров
Васечкин
Васечкин
Это значит, что нам надо придумать механизм фильтрации детей по двум спискам, или какой-то другой способ решить задачу. Рассмотрим три варианта.
Фильтрация фамилий.
Заводим два множества, считываем фамилии, и если фамилия уже есть в первом списке, то записываем ее во второй.
Остается найти разницу двух списков и мы получим ответ.
Метод словаря.
Заводим словарь. Если фамилия есть в словаре, увеличиваем содержимое ячейки словаря, в противном случае добавляем ее в словарь со значением 1.
Считаем количество фамилий со значением 1 и выводим в качестве ответа.
Метод одного множества.
Этот метод основан на предположении, что одна и та же фамилия не может встретиться больше чем два раза, в противном случае метод не сработает.
Заводим множество, читаем фамилии. Если фамилии нет в множестве, добавляем ее, если есть – удаляем. Ответ – размер оставшегося множества.
Посмотреть код
Решение
# Фильтрация фамилий
list1size = int(input())
list2size = int(input())
list1 = set()
list2 = set()
for _ in range(list1size + list2size):
name = input()
if name in list1:
list2.add(name)
else:
list1.add(name)
# print(list1, list2)
if len(junction := (list1 ^ list2)) != 0:
print(len(junction))
else:
print('Таких нет')
Решение
# Метод словаря
list1size = int(input())
list2size = int(input())
porridge_eaters = {}
for _ in range(list1size + list2size):
eater = input()
porridge_eaters[eater] = porridge_eaters.get(eater, 0) + 1
one_porridge_lovers = []
for eater in porridge_eaters:
if porridge_eaters[eater] == 1:
one_porridge_lovers.append(eater)
if len(one_porridge_lovers) != 0:
print(len(one_porridge_lovers))
else:
print('Таких нет')
Решение
# Метод одного множества
list1size = int(input())
list2size = int(input())
porridge_eaters = set()
for _ in range(list1size + list2size):
eater = input()
if eater in porridge_eaters:
porridge_eaters.remove(eater)
else:
porridge_eaters.add(eater)
if porridge_eaters:
print(len(porridge_eaters))
else:
print('Таких нет')
Можно чуть короче
m = int(input())
o = int(input())
al = set()
for _ in range(m + o):
al.add(input())
result = abs(m + o – (len(al) * 2))
if result > 0:
print(result)
else:
print(‘Таких нет’)
Можно, но с читабельностью беда.
Подходы основанные на математике всегда оказываются более эффективны по сравнению с остальными. Если, конечно, задача формализуется в стороны прямых вычислений. Но они же требуют больше усилий для того, чтобы понять как это все работает.
Хорошее решение. Переменные только бы назвать по-человечески.
С этим соглашусь, сам потом минут пять пытался вникнуть, почему это решение работает