List comprehension: от базового шаблона до разбора на блоки
less_16__list_comprehension__stack__queue/theory_01__lists_comprehension.md
Проходит все формы генератора списков — базовый, с условием после for, с тернарным if...else внутри выражения, вложенный двойной for, LC внутри LC для матриц, несколько условий подряд и flattening. Финальная и самая ценная часть — формальный алгоритм из 4 шагов, который превращает любой, даже многоярусный, list comprehension в эквивалентный набор вложенных циклов и if, с разобранным примером на пяти уровнях вложенности.
- [x**2 for x in nums] — базовый шаблон [выражение for переменная in iterable if условие]
- ['even' if x % 2 == 0 else 'odd' for x in nums] — тернарный if внутри выражения
- [(x, y) for x in [...] for y in [...]] — вложенный двойной for, порядок циклов
- [[x*y for x in range(1,4)] for y in range(1,4)] — LC внутри LC для матрицы
- [x for row in matrix for x in row] — flattening вложенных списков
- Алгоритм разбора сложного LC на блоки: result=[], перенос for/if по порядку, result.append(выражение)
Показать начало файла (219 строк всего)
## Определение
**List comprehension** (LC) — это способ создания списка из итерируемого объекта в одной строке
с помощью выражения, цикла и (опционально) условий.
Общий шаблон:
```python
[выражение for переменная in итерируемый_объект if условие]
```
⚠️ ⚠️ ⚠️
ВАЖНО:
Если логика выражения сложнее базового шаблона, его КРАЙНЕ ЖЕЛАТЕЛЬНО разбить на блоки.
---
## 1. Базовый LC
```python
nums = [1, 2, 3, 4, 5]
squares = [x**2 for x in nums]
print(squares) # [1, 4, 9, 16, 25]
```
---
## 2. LC с условием (`if` после цикла)
```python
nums = [1, 2, 3, 4, 5]
even = [x for x in nums if x % 2 == 0]
print(even) # [2, 4]
```
---
## 3. LC с тернарным оператором (`if ... else ...`)
Тут `if` стоит **внутри выражения**, а не после цикла.
```python
nums = [1, 2, 3, 4, 5]
labels = ["even" if x % 2 == 0 else "odd" for x in nums]
print(labels) # ['odd', 'even', 'odd', 'even', 'odd']
```
Аналогично:
```python
labels_2 = []
for x in nums:
labels_2.append("even" if x % 2 == 0 else "odd")
print(labels_2) # ['odd', 'even', 'odd', 'even', 'odd']
# --- или -------------------------------------
labels_3 = []
for x in nums:
if x % 2 == 0:
labels_3.append("even")
…