Продажи
Суммируем покупки для каждой пары покупатель–товар, затем сортируем имена.
Как к ней подойти
Потренируйтесь хранить пары «ключ - значение» и находить нужные записи в словаре.
Словарь связывает ключ со значением и позволяет быстро найти запись по ключу. Решите, что будет ключом, что значением и как обрабатывать отсутствующую запись. Для подсчётов удобно начинать с нуля.
Внешний словарь выделяет покупателя, внутренний хранит итог каждого товара. Повторы накапливаются сразу, весь журнал не нужен.
Проверьте перед запуском
- Количество нужно преобразовать в int.
- Сортировать требуется и покупателей, и товары.
Сравните свой подход
Ниже - готовое решение, другой способ, если он есть, и важные детали проверки.
Ваше принятое решение
Рекомендуемое решение: Вложенные словари
Внешний словарь выделяет покупателя, внутренний хранит итог каждого товара. Повторы накапливаются сразу, весь журнал не нужен.
import sys
sales = {}
for line in sys.stdin:
buyer, product, count = line.split()
goods = sales.setdefault(buyer, {})
goods[product] = goods.get(product, 0) + int(count)
for buyer in sorted(sales):
print(buyer + ':')
for product in sorted(sales[buyer]):
print(product, sales[buyer][product])
Время: O(n + k log k) в среднем, n записей, k разных пар; без учёта длины строк. Память: O(k) записей и списков сортировки.
Другой способ: Сортировка записей и группировка
После сортировки одинаковые покупатели и товары идут подряд. groupby выделяет группы, а sum сворачивает количества.
import sys
from itertools import groupby
records = []
for line in sys.stdin:
buyer, product, count = line.split()
records.append((buyer, product, int(count)))
records.sort()
for buyer, rows in groupby(records, key=lambda r: r[0]):
print(buyer + ':')
for product, purchases in groupby(rows, key=lambda r: r[1]):
print(product, sum(r[2] for r in purchases))
Время: O(n log n), без учёта длины строк. Память: O(n) записей.