Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Python one-liners can make common tasks easier to read, but a shorter expression is not automatically faster. The ten patterns below replace routine loops and bookkeeping with familiar Python idioms; use them when they clarify intent, and measure a representative workload before claiming a speedup.

When Python one-liners help

Think of a one-liner as a compact expression that replaces repetitive scaffolding—not a rule to cram a whole algorithm onto one physical line. A comprehension can make a simple transformation explicit; nested conditions or side effects may make the same expression harder to maintain than a loop.

Some idioms can avoid an intermediate list, stop iteration early, or use optimized built-ins. Those are plausible sources of savings, not guarantees: runtime depends on the data, Python version, and surrounding work. The official Functional Programming HOWTO documents behavior and alternatives, not a blanket benchmark for these examples.

Ten useful Python one-liners

1. Transform or filter with a list comprehension

Before: build an empty list, loop over values, test each one, and append the transformed result. After:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
cleaned = [clean(x) for x in values if keep(x)]

This creates a list containing only transformed values that pass the condition. Use it when you need the resulting collection, perhaps to iterate over more than once. If the expression grows nested or difficult to scan, use a regular loop instead. Comprehensions are one concise way to express work that can also be written with map() or filter(); those built-ins remain valid choices.

2. Build a dictionary with a dictionary comprehension

Before: initialize a dictionary, loop over rows, and assign each key-value pair. After:

by_id = {key(row): value(row) for row in rows}

This constructs a mapping in one expression. Keep the key and value calculations straightforward so readers can see what each row contributes. If a key repeats, a later value replaces the earlier value for that key, just as with repeated dictionary assignment.

3. Keep an index and item together with enumerate()

Before: set a counter, increment it in a loop, and pair it with each item. After:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
numbered = [(i, item) for i, item in enumerate(items, start=1)]

enumerate() yields a count and each iterable value together; its default start is zero. Use start=1 for human-facing numbering, not to change Python’s usual zero-based indexing. The comprehension materializes a list of pairs; for a one-pass operation, iterate directly with for i, item in enumerate(items) instead.

4. Pair parallel inputs with zip()

Before: loop over numeric positions and look up corresponding elements in two sequences. After:

pairs = [(name, score) for name, score in zip(names, scores, strict=True)]

zip() yields pairs lazily, but its default behavior stops when the shortest input ends. With strict=True, it raises ValueError if the inputs have different lengths, which is useful when a mismatch signals bad data. The strict parameter was added in Python 3.10; use zip(names, scores) on older versions only when truncation is acceptable. If unequal inputs should be padded, use itertools.zip_longest. Wrapping the result in brackets above creates a list; a loop over zip() can consume pairs as they are produced. See the built-in functions reference for the behavior.

5. Check whether any item matches with any()

Before: set a flag to false, loop until a match is found, and update the flag. After:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
has_invalid = any(not is_valid(record) for record in records)

This asks whether at least one record passes the test—in this example, whether any record is invalid. any() stops once it sees a true value, so later records are not tested. An empty iterable returns False.

6. Check whether every item matches with all()

Before: assume every record passes, then clear a flag if one fails. After:

all_valid = all(is_valid(record) for record in records)

This asks whether every record passes, and it stops at the first failure. An empty iterable returns True: there is no item that fails the condition. That behavior can matter when empty input is possible, so decide whether it matches the meaning of your application.

7. Sort by a field with sorted()

Before: write a custom sorting routine or rearrange records manually. After:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
sorted_users = sorted(users, key=lambda user: user.name)

sorted() returns a new list and leaves the input iterable unchanged. The key function extracts the value used for ordering; if you need to sort an existing list in place, use its .sort(key=...) method instead. Sorting necessarily produces an ordered result, so account for that list when working with a large iterable.

8. Assemble strings with str.join()

Before: append each text fragment to a growing string inside a loop. After:

line = ', '.join(parts)

The separator goes between the pieces, and every item must already be a string. For numbers or other objects, convert explicitly, for example ', '.join(str(x) for x in values). For a sequence of fragments, join() is a clear alternative to repeated concatenation.

9. Feed a generator expression to a one-pass consumer

Before: first build a list of squared values, then sum the list. After:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
total = sum(x * x for x in values)

The generator expression supplies values to sum() one at a time instead of first creating a temporary list. This is useful when the result is consumed once; use a list comprehension if you need to retain or revisit all the values. A generator is consumed as it runs, so it is not a reusable collection.

10. Swap values with unpacking

Before: create a temporary variable, then perform three assignments. After:

first, second = second, first

Python evaluates the right-hand values before assigning them, so the original values switch places without a temporary name. Unpacking also works for assigning multiple values from an iterable when the number of values matches the targets. Prefer descriptive names; brevity alone is not a reason to obscure what the variables mean.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

What the performance evidence does—and does not—show

A 2022 preliminary study, “Does Coding in Pythonic Zen Peak Performance? Preliminary Experiments of Nine Pythonic Idioms at Scale,” reported that selected experiments involving list comprehensions, generator expressions, zip(), and itertools.zip_longest saved up to 7,000 MB and up to 32.25 seconds. Those are maxima from the study’s experiments, not expected gains for every program or a benchmark of all ten examples here. The authors also described the results as raising questions about real-world settings. Read the study abstract in that context.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

For code where speed matters, profile a representative workload on the Python version and data sizes you actually use. Check whether a change reduces allocation, avoids work through lazy consumption or early stopping, or simply changes the appearance of the code. Keep the clearer loop if the compact version is harder to understand and profiling shows no meaningful benefit.

Avoid a compact-looking mutable-list trap

Multiplying a list of empty lists does not create independent inner lists:

bad = [[]] * 3

Each position refers to the same mutable list, so appending through one position appears in all three. Create a separate list for each position instead:

good = [[] for _ in range(3)]

This is one case where the comprehension is not just shorter; it expresses the required independent objects.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.