Мини-урок · перед практикой

Продажи

Суммируем покупки для каждой пары покупатель–товар, затем сортируем имена.

Как к ней подойти

Потренируйтесь хранить пары «ключ - значение» и находить нужные записи в словаре.

Коротко о теме

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

Ключевая идея · Вложенные словари

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

Проверьте перед запуском

  • Количество нужно преобразовать в 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) записей.