Group and aggregate records with defaultdict

Python
from collections import defaultdict
from dataclasses import dataclass


@dataclass(frozen=True)
class Sale:
    region: str
    product: str
    units: int
    revenue: float


def summarise(sales: list[Sale]) -> dict[str, dict]:
    """Group sales by region and compute count, units and revenue."""
    stats: dict[str, dict] = defaultdict(lambda: {"count": 0, "units": 0, "revenue": 0.0})
    for sale in sales:
        row = stats[sale.region]
        row["count"] += 1
        row["units"] += sale.units
        row["revenue"] += sale.revenue
    return dict(stats)


def top_products(sales: list[Sale], limit: int = 3) -> list[tuple[str, float]]:
    """Return the products with the highest total revenue."""
    totals: dict[str, float] = defaultdict(float)
    for sale in sales:
        totals[sale.product] += sale.revenue
    return sorted(totals.items(), key=lambda item: item[1], reverse=True)[:limit]


if __name__ == "__main__":
    rows = [
        Sale("north", "widget", 2, 20.0),
        Sale("north", "gadget", 1, 15.0),
        Sale("south", "widget", 5, 50.0),
    ]
    print(summarise(rows))
    print(top_products(rows))