Python dictionaries are the most versatile built-in data structure — and most developers only scratch their surface. Beyond basic lookup, dicts offer defaultdict for auto-defaults, Counter for frequency counting, ChainMap for layered configs, and modern merge operators (Python 3.9+).
⚡ TL;DR: Use .get(key, default) instead of bracket access. setdefault() for mutable defaults. defaultdict eliminates “if key not in dict” boilerplate. Counter counts anything. | merges dicts in Python 3.9+. Dict comprehensions are 30% faster than loops.
Core dict methods
user = {'name':'Alice','age':30}
user.get('missing','default') # 'default' — no KeyError
user.pop('age', None) # Remove, return None if missing
user.setdefault('tags',[]).append('admin') # Init once, append safely
# Merge (Python 3.9+)
merged = base | overrides # New dict
base |= overrides # In-place
# Iteration
for k,v in user.items(): print(k,v)
keys = list(user.keys())
values = list(user.values())
defaultdict — no more KeyError
from collections import defaultdict
# Grouping
grouped = defaultdict(list)
for item in items:
grouped[item.category].append(item)
# No 'if key not in grouped' needed!
# Counting
counts = defaultdict(int)
for word in text.split():
counts[word] += 1
# Nested
nested = defaultdict(lambda: defaultdict(int))
nested['users']['alice'] += 1
Counter — frequency counting
from collections import Counter
words = ['apple','banana','apple','cherry','apple']
c = Counter(words)
c.most_common(2) # [('apple',3),('banana',1)]
c['missing'] # 0, not KeyError
# Count characters
Counter('hello') # Counter({'l':2,'h':1,'e':1,'o':1})
# Arithmetic
Counter({'a':3,'b':2}) - Counter({'a':1}) # Counter({'a':2,'b':2})
Dict comprehensions
{x:x**2 for x in range(5)} # {0:0,1:1,2:4,3:9,4:16}
{v:k for k,v in d.items()} # Invert dict
{k.lower():v for k,v in data.items()} # Lowercase keys
{k:v for k,v in scores.items() if v>=90} # Filter
ChainMap — layered config
from collections import ChainMap
defaults = {'debug':False,'timeout':30}
project = {'timeout':60}
user = {'timeout':5}
config = ChainMap(user,project,defaults)
config['timeout'] # 5 (user wins)
config['debug'] # False (falls back)
- ✅ .get(k,d) for optional keys
- ✅ defaultdict(list) for grouping, defaultdict(int) for counting
- ✅ Counter.most_common(n) for top-N
- ✅ Dict comprehensions over manual loops
- ❌ Never modify dict while iterating
- ❌ Never use mutable as default function arg
Dicts underpin the hash table guide — Python dicts ARE hash tables. External reference: Python collections docs.
Recommended Reading
→ Designing Data-Intensive Applications — The bible of distributed systems and production engineering at scale.
→ The Pragmatic Programmer — Timeless engineering wisdom every senior developer needs.
Affiliate links. We earn a small commission at no extra cost to you.
Free Weekly Newsletter
🚀 Join 2,000+ Senior Developers
Get expert-level JavaScript, Python, AWS, system design and AI secrets every week. Zero fluff, pure signal.
Discover more from CheatCoders
Subscribe to get the latest posts sent to your email.
