Базовый list comprehension
Списковое включение создаёт новый список, применяя выражение к каждому элементу итерируемого объекта.
Исходный список при этом не меняется, если выражение само не вызывает побочных эффектов.
numbers = [1, 4, 6, 7, 9]
squares = [number ** 2 for number in numbers]
print(squares)
print(numbers)Фильтр if
Фильтр после for определяет, какие элементы попадут в результат.
Такой вариант хорошо читается, когда условие короткое и не требует дополнительных шагов.
even_numbers = [number for number in range(10) if number % 2 == 0]
print(even_numbers)Условное выражение if-else
Если нужно добавить значение для каждого элемента, но выбрать форму значения по условию, if-else пишется перед for.
Вложенный if-else внутри comprehension допустим, но быстро ухудшает читаемость.
numbers = [2, 7, 5, 4, 1, 1, 7, 8]
modified = [number if number % 2 == 0 else -1 for number in numbers]
print(modified)Вложенный цикл и матрица
Вложенный comprehension можно читать как обычные вложенные for в том же порядке.
Для разворачивания матрицы сначала перебирается строка, затем значение в строке.
matrix = [[1, 2, 3], [4, 5, 6]]
flattened = [value for row in matrix for value in row]
print(flattened)zip()
zip() объединяет несколько последовательностей в пары или кортежи по позициям.
Если длины различаются, результат заканчивается на самой короткой последовательности.
names = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]
for name, age in zip(names, ages):
print(f"{name} is {age} years old.")Стек, очередь и устойчивая сортировка
Стек возвращает последним добавленный элемент: append() добавляет, pop() снимает верхушку.
Очередь возвращает первым добавленный элемент. Для эффективного удаления слева используйте deque.
Устойчивость сортировки означает, что элементы с одинаковым ключом остаются в исходном относительном порядке.
from collections import deque
stack = []
stack.append("open")
stack.append("edit")
print(stack.pop())
queue = deque(["print", "scan", "send"])
print(queue.popleft())