Dict & Set Comprehensions
Also Known As
list comprehension
dict comprehension
set comprehension
generator expression
TL;DR
Python's concise syntax for building dicts, sets, and lists in a single expression — replacing verbose for-loop accumulation patterns.
Explanation
Comprehensions: list [expr for x in iterable if cond], dict {k: v for ...}, set {expr for ...}, generator (expr for ...). They are faster than equivalent for-loops (built-in optimisation), more readable for simple transformations, and composable. Nested comprehensions (matrix flattening) are possible but harm readability beyond two levels. Generator expressions are lazy — use when you only iterate once to avoid building the full list. dict.fromkeys() and Counter() are preferable to comprehensions for specific patterns.
Common Misconception
✗ List comprehensions are always faster than for loops — for complex bodies with multiple function calls, the performance difference is negligible; use comprehensions for readability, not micro-optimisation.
Why It Matters
Comprehensions are idiomatic Python — code that uses them reads as 'what' (transform this collection) rather than 'how' (iterate, append, check). Reviewers expect them for simple transforms.
Common Mistakes
- Nested comprehensions with 3+ levels — break into named generators for readability.
- List comprehension when a generator suffices — [x for x in data] passed to sum() builds a full list; use sum(x for x in data).
- Complex filtering logic in comprehension conditions — extract to a named function.
- Mutating state inside a comprehension — comprehensions are for building new structures, not side effects.
Code Examples
✗ Vulnerable
# Verbose for-loop patterns:
name_map = {}
for user in users:
name_map[user.id] = user.name
active_ids = []
for user in users:
if user.is_active:
active_ids.append(user.id)
unique_roles = set()
for user in users:
unique_roles.add(user.role)
✓ Fixed
# Concise comprehensions:
name_map = {user.id: user.name for user in users}
active_ids = [user.id for user in users if user.is_active]
unique_roles = {user.role for user in users}
# Generator expression (lazy — no full list built):
total = sum(order.total for order in orders if order.is_complete)
# Nested — flatten matrix:
flat = [cell for row in matrix for cell in row]
Tags
🤝 Adopt this term
£79/year · your link shown here
Added
16 Mar 2026
Edited
22 Mar 2026
Views
24
🤖 AI Guestbook educational data only
|
|
Last 30 days
Agents 0
No pings yet today
No pings yesterday
Amazonbot 6
Perplexity 5
Google 4
Ahrefs 2
DuckDuckGo 1
Also referenced
How they use it
crawler 17
crawler_json 1
Related categories
⚡
DEV INTEL
Tools & Severity
🟢 Low
⚙ Fix effort: Low
⚡ Quick Fix
Use dict comprehensions to transform dicts, set comprehensions to deduplicate, and generator expressions to avoid materialising large intermediate lists
📦 Applies To
python 2.7
web
cli
🔗 Prerequisites
🔍 Detection Hints
Multiple separate passes over data that one comprehension would combine; dict() constructor with list comprehension that dict comprehension would simplify
Auto-detectable:
✓ Yes
pylint
ruff
⚠ Related Problems
🤖 AI Agent
Confidence: Low
False Positives: High
✓ Auto-fixable
Fix: Low
Context: Function