Data from files and APIs usually arrives as a list of dictionaries: one dictionary per row, with the same keys. rows[0]["total"] is the first row's total, and a loop or comprehension visits every row: sum(r["total"] for r in rows).
To look rows up by id, build a dictionary once instead of searching the list every time: by_id = {r["id"]: r for r in rows}. Then by_id["A1"] is instant.
Real rows aren't always complete. r.get("email") gives None for a missing key, and r.get("email") or "" turns both missing and empty values into empty text.
Sometimes you need the reverse shape, a dictionary of lists, such as names grouped by team. groups.setdefault(team, []).append(name) creates the list the first time a team appears.