List comprehension are one of my favourite pieces of Python syntax. We can use a list comprehension to create a list from another iterable. It's fast, Pythonic, and best of all, easy to read.

When working with code, it's quite common for us to run into a pattern like this:

numbers = [1, 2, 3, 4, 5]
doubled_numbers = []

for number in numbers:
	doubled_numbers.append(number * 2)

This method is perfectly functional, but compare it to the list comprehension version:

numbers = [1, 2, 3, 4, 5]
doubled_numbers = [number * 2 for number in numbers]

Not only is the code more succinct, we've actually made it more readable as well. A vast improvement!

List comprehensions also allow for more than one for clause. We can use this to find all the possible combinations of dice rolls for two dice, for example:

roll_combinations = [(d1, d2) for d1 in range(1, 7) for d2 in range(1, 7)]

Not bad for a one-liner!

You can find out more about list comprehensions in the official documentation.