Python Cheatsheet

Comprehensions

Use this Python reference while you build software engineering projects, review code for technical interview prep, or polish examples for a software engineer resume.

List Comprehensions

# Basic: [expression for item in iterable]
squares = [x ** 2 for x in range(10)]
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# With filter: [expression for item in iterable if condition]
evens = [x for x in range(20) if x % 2 == 0]
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

# Transform and filter
words = ["hello", "world", "foo", "bar"]
long_upper = [w.upper() for w in words if len(w) > 3]
# ['HELLO', 'WORLD']

# With ternary (if-else in the expression, not the filter)
labels = ["even" if x % 2 == 0 else "odd" for x in range(5)]
# ['even', 'odd', 'even', 'odd', 'even']

# Nested loops (outer first, then inner — same order as nested for loops)
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [val for row in matrix for val in row]
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

# Cartesian product
pairs = [(x, y) for x in range(3) for y in range(3) if x != y]
# [(0,1),(0,2),(1,0),(1,2),(2,0),(2,1)]

# Calling a function
results = [process(x) for x in data]

# Unpacking tuples
sums = [a + b for a, b in [(1, 2), (3, 4), (5, 6)]]
# [3, 7, 11]

Dictionary Comprehensions

# Basic: {key_expr: val_expr for item in iterable}
squares = {x: x**2 for x in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

# With filter
{k: v for k, v in d.items() if v > 0}

# Invert dict (assumes unique values)
inv = {v: k for k, v in original.items()}

# Transform keys and values
{k.lower(): v.strip() for k, v in raw.items()}

# From two lists
{k: v for k, v in zip(keys, values)}

# Group by
words = ["apple", "banana", "avocado", "blueberry"]
by_letter = {
    ch: [w for w in words if w[0] == ch]
    for ch in set(w[0] for w in words)
}
# {'a': ['apple', 'avocado'], 'b': ['banana', 'blueberry']}

Set Comprehensions

# Basic: {expression for item in iterable}
unique_squares = {x ** 2 for x in range(-5, 6)}
# {0, 1, 4, 9, 16, 25}

# With filter
vowels = {ch for ch in "hello world" if ch in "aeiou"}
# {'e', 'o'}

# Lowercase unique words
vocab = {word.lower() for word in text.split()}

Generator Expressions

Lazy evaluation — produce values one at a time, no intermediate list allocated.

# Basic: (expression for item in iterable)
gen = (x ** 2 for x in range(10))

next(gen)         # 0
next(gen)         # 1
list(gen)         # [4, 9, ..., 81]  (already consumed 0, 1)

# Use directly in function calls (single-arg functions: no extra parens)
total = sum(x ** 2 for x in range(100))
any(x > 50 for x in data)
all(x > 0 for x in data)
max(len(word) for word in words)
",".join(str(x) for x in lst)

# With filter
total = sum(x for x in lst if x > 0)

# First match
first = next((x for x in lst if x > 5), None)

Nested Comprehensions (2D)

# Build 3x3 identity matrix
identity = [[1 if i == j else 0 for j in range(3)] for i in range(3)]
# [[1,0,0],[0,1,0],[0,0,1]]

# Transpose a matrix
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
transposed = [[row[i] for row in matrix] for i in range(3)]
# [[1,4,7],[2,5,8],[3,6,9]]

# Or using zip
transposed = [list(row) for row in zip(*matrix)]

Walrus Operator in Comprehensions

Compute once, use in both filter and expression (Python 3.8+).

# Without walrus — transform(x) called twice
[transform(x) for x in data if transform(x) is not None]

# With walrus — called once
[y for x in data if (y := transform(x)) is not None]

# Keep only valid results
results = [parsed for line in lines if (parsed := parse(line))]

Performance and Readability Guidelines

# Comprehensions vs loops — comprehensions are generally faster
# but avoid when logic is complex enough to obscure intent

# Readable: simple expression, one filter condition
good = [x.strip() for x in lines if x.strip()]

# Less readable: complex nested logic — use a regular loop instead
bad = [f(g(x)) for x in d.values() if x > 0 for g in transforms if g(x)]

# Memory: use generator expressions for large data
# Bad for large N:
total = sum([x**2 for x in range(10**7)])  # creates full list in memory
# Good:
total = sum(x**2 for x in range(10**7))    # lazy, O(1) memory

# Avoid side effects in comprehensions
# Bad: [print(x) for x in lst]  — use a for loop
# Good: [process(x) for x in lst]  — when you need the results list

Common Patterns

# Flatten one level
flat = [item for sublist in nested for item in sublist]

# Unique values preserving order
seen = set()
unique = [x for x in lst if not (x in seen or seen.add(x))]

# Zip + comprehension
totals = [a + b for a, b in zip(list1, list2)]

# Conditional expression in comprehension
clamped = [max(0, min(100, x)) for x in values]

# Count with sum
count_positive = sum(1 for x in data if x > 0)

# Dict from two lists with transformation
grade_map = {name: grade * 1.1 for name, grade in zip(names, grades)}