Продажи
Вы решили задачу. Теперь можно сравнить подходы.
Суммируем покупки для каждой пары покупатель–товар, затем сортируем имена.
Авторский разбор для локальной версии на основе условия задачи. Это не выгрузка чужих посылок и не официальное решение исходного сайта.
Ваше принятое решение
Рекомендуемое решение: Вложенные словари
Внешний словарь выделяет покупателя, внутренний хранит итог каждого товара. Повторы накапливаются сразу, весь журнал не нужен.
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) записей.
На что обратить внимание
- Количество нужно преобразовать в int.
- Сортировать требуется и покупателей, и товары.
Рекомендация учитывает сложность и читаемость для этой задачи. Единственного самого быстрого решения для всех размеров входа и всех компьютеров может не быть.