Group by Key (Dictionary Grouping Guide)¶
Zero-dependency Python snippets for grouping items by key using the standard library.
12 snippets available in this sub-category.
Simple¶
Group list of pairs by key (defaultdict)¶
dict
group
defaultdict
pairs
data-structures
Group values by key using defaultdict
from collections import defaultdict
pairs = [("a", 1), ("b", 2), ("a", 3)]
groups = defaultdict(list)
for k, v in pairs:
groups[k].append(v)
print(dict(groups)) # {'a': [1, 3], 'b': [2]}
Notes
- defaultdict(list) is the idiomatic way to group
Manual grouping by key¶
dict
group
manual
data-structures
Group values by key without defaultdict
pairs = [("a", 1), ("b", 2), ("a", 3)]
groups = {}
for k, v in pairs:
if k not in groups:
groups[k] = []
groups[k].append(v)
print(groups) # {'a': [1, 3], 'b': [2]}
Notes
- Manual approach for grouping if defaultdict is unavailable
Advanced Patterns¶
Group by value (invert one-to-many)¶
dict
group
invert
value
data-structures
Group keys by value (invert one-to-many)
from collections import defaultdict
pairs = [("a", 1), ("b", 2), ("c", 1)]
groups = defaultdict(list)
for k, v in pairs:
groups[v].append(k)
print(dict(groups)) # {1: ['a', 'c'], 2: ['b']}
Notes
- Useful for inverting mappings (one-to-many)
Group by custom function (e.g., length)¶
dict
group
custom
function
data-structures
Group items by custom function of key/value
from collections import defaultdict
words = ["apple", "pear", "banana", "fig"]
groups = defaultdict(list)
for word in words:
groups[len(word)].append(word)
print(dict(groups)) # {5: ['apple'], 4: ['pear'], 6: ['banana'], 3: ['fig']}
Notes
- Grouping can use any function of the item
Group by multiple keys (tuple/grouping)¶
dict
group
tuple
multi-key
data-structures
Group by multiple fields (tuple as key)
from collections import defaultdict
records = [
{"city": "NY", "type": "A", "val": 1},
{"city": "NY", "type": "B", "val": 2},
{"city": "LA", "type": "A", "val": 3},
]
groups = defaultdict(list)
for rec in records:
key = (rec["city"], rec["type"])
groups[key].append(rec["val"])
print(dict(groups)) # {('NY', 'A'): [1], ('NY', 'B'): [2], ('LA', 'A'): [3]}
Notes
- Tuples allow grouping by multiple fields
Group and aggregate (sum, count, min, max)¶
dict
group
aggregate
sum
count
data-structures
Group and aggregate values by key
from collections import defaultdict
pairs = [("a", 1), ("b", 2), ("a", 3)]
sums = defaultdict(int)
for k, v in pairs:
sums[k] += v
print(dict(sums)) # {'a': 4, 'b': 2}
counts = defaultdict(int)
for k, _ in pairs:
counts[k] += 1
print(dict(counts)) # {'a': 2, 'b': 1}
Notes
- Aggregation patterns: sum, count, min, max
Group and flatten (single list of all values)¶
dict
group
flatten
data-structures
Flatten grouped values to a single list
from collections import defaultdict
pairs = [("a", 1), ("b", 2), ("a", 3)]
groups = defaultdict(list)
for k, v in pairs:
groups[k].append(v)
flat = [v for group in groups.values() for v in group]
print(flat) # [1, 3, 2]
Notes
- Flattening combines all grouped values into one list
Group by key with set (unique values)¶
dict
group
set
unique
data-structures
Group values by key, unique only
from collections import defaultdict
pairs = [("a", 1), ("a", 1), ("b", 2)]
groups = defaultdict(set)
for k, v in pairs:
groups[k].add(v)
print(dict(groups)) # {'a': {1}, 'b': {2}}
Notes
- set ensures only unique values per key
Group by key with order preserved (OrderedDict)¶
dict
group
order
ordered-dict
data-structures
Group values by key, preserving insertion order
from collections import OrderedDict
pairs = [("a", 1), ("b", 2), ("a", 3)]
groups = OrderedDict()
for k, v in pairs:
if k not in groups:
groups[k] = []
groups[k].append(v)
print(groups) # OrderedDict([('a', [1, 3]), ('b', [2])])
Notes
- OrderedDict preserves insertion order of keys
Group by key with itertools.groupby (sorted input)¶
dict
group
itertools
groupby
data-structures
Group by key using itertools.groupby (requires sorted input)
from itertools import groupby
pairs = [("a", 1), ("a", 2), ("b", 3)]
pairs.sort(key=lambda x: x[0])
groups = {k: [v for _, v in group] for k, group in groupby(pairs, key=lambda x: x[0])}
print(groups) # {'a': [1, 2], 'b': [3]}
Notes
- groupby requires sorted input by key
Performance and Edge Cases¶
Large groupings (performance)¶
dict
group
performance
data-structures
defaultdict is fast for large groupings
import time
from collections import defaultdict
N = 10**6
pairs = [("a", i) for i in range(N)]
start = time.time()
groups = defaultdict(list)
for k, v in pairs:
groups[k].append(v)
print("Time:", time.time() - start)
Notes
- defaultdict is efficient for high-volume grouping
Edge cases: empty input, all unique keys¶
dict
group
edge-case
data-structures
Handle edge cases for grouping
from collections import defaultdict
print(dict(defaultdict(list))) # {}
pairs = [("a", 1), ("b", 2)]
groups = defaultdict(list)
for k, v in pairs:
groups[k].append(v)
print(dict(groups)) # {'a': [1], 'b': [2]}
Notes
- Handles empty input and all-unique keys gracefully
🔗 Cross Reference¶
- Reference: See 📂 Dictionary Comprehension
- Reference: See 📂 Invert Key-Value Pairs
🏷️ Tags¶
dict
, group
, defaultdict
, aggregate
, custom
, flatten
, order
, itertools
, edge-case
, performance
, data-structures
📝 Notes¶
- defaultdict is the idiomatic way to group by key
- Use groupby for sorted/grouped data
- Aggregation and flattening are common patterns