Group records and invert a dictionary

Group with setdefault or defaultdict(list) — one pass, one lookup per record, no scanning for an existing group. Inverting is a one-line comprehension, with two traps: duplicate values silently collapse, and unhashable values raise.

Overview

Three ways to group

setdefault(key, []).append(x) — no import, and it makes the default explicit. It does construct an empty list on every call, which is why the next form is usually preferred.

defaultdict(list) — the idiomatic answer. Remember that reading a missing key creates it, so it is not safe to inspect casually.

itertools.groupby — the one that catches people. It groups consecutive equal keys only, so it needs the input sorted by the same key first. It is not the SQL GROUP BY its name suggests.

Dicts, sets & hashingCoding problemEasy

Step through it

What to watch

  • Each record costs one lookup and one append.
  • Groups appear as they are first encountered.
  • Inversion assumes the values are unique — watch what happens when they are not.

Say this out loud

"defaultdict(list) and append - one pass, O(n). For inverting, a dict comprehension, but I'd check the values are unique first, because duplicates silently overwrite and you lose entries without an error."

Group records and invert a dictionary

Group a list of records by a field. Then invert a dictionary so the values become keys.

Two ways inversion breaks

Duplicate values. {v: k for k, v in d.items()} keeps only the last key for each repeated value, silently. If duplicates are possible, invert to lists instead — which is just grouping again, by value.

Unhashable values. A value that was fine as a value cannot necessarily be a key: a dict mapping names to lists of scores cannot be inverted directly, because a list is unhashable.

Where this shows up

Grouping is the shape behind most "organise this data" questions: anagram groups keyed on sorted letters, files keyed on their hash, log lines keyed on their level. Recognising it saves you from writing a nested loop that scans for an existing group — the accidental O(n²) this idiom exists to avoid.

Run it in Python

The three grouping idioms agreeing, groupby getting it wrong on unsorted input, and both inversion failures caught in the act.

grouping.pyPython 3
Output

How the code works

  1. setdefault(team, []).append(name)One lookup and one append per record. The alternative — scanning existing groups for a match — is the O(n²) this idiom exists to avoid.
  2. groupby(people, key=...)Groups only consecutive equal keys, so unsorted input produces a group per run and later runs overwrite earlier ones. Sorting first is mandatory.
  3. {v: k for k, v in sizes.items()}Silently loses ana, because two names share a size and the later key wins. No error, one entry gone.
  4. {v: k for k, v in scores.items()}A TypeError: the values are lists, and a key must be hashable. Converting to tuples is the usual fix.

Change one thing

  • Group by two fields at once using a tuple key. It works because tuples are hashable — the same reason they can be dict keys at all.
  • Read a missing key from the defaultdict and print it again. The read created an entry, which is the trap that idiom carries.

Where this runs

Real CPython, compiled to WebAssembly and running on your own machine — nothing is uploaded. The first run takes a few seconds while the interpreter downloads; after that it is immediate. Need more room, or want to paste your own attempt? Use the Python compiler.

Check yourself

0 of 3

Answer without scrolling back up.

  1. itertools.groupby differs from SQL's GROUP BY in that it:

  2. Inverting a dict with a comprehension when two keys share a value:

  3. A dict mapping names to lists of scores cannot be inverted directly because:

Cheat sheet

Group records and invert a dictionary

Group with setdefault or defaultdict(list) — one pass, one lookup per record, no scanning for an existing group. Inverting is a one-line comprehension, with two traps: duplicate values silently collapse, and unhashable values raise.

INTERVIEW · vizlearn.in/interview/grouping-and-inverting-dictionaries.html

About the author

Ashish Jangra builds and maintains VizLearn. Every module here is written and the visualisation behind it hand-built, so the numbers in a readout come from the same code that draws the picture. Corrections are genuinely welcome and get priority over everything else — if a page states something wrong, or an animation misrepresents what the algorithm does, get in touch.