Привет! Мы уже научились создавать простые генераторы списков. Но что, если нужно создать список списков (матрицу) или обработать данные с несколькими уровнями вложенности? Здесь на помощь приходят вложенные генераторы.
В этой статье мы разберём:
- Что такое вложенные генераторы
- Как создавать матрицы
- Как работать с несколькими циклами
- Транспонирование матриц
- Что нужно знать перед началом
- Основная часть
- Что такое вложенный генератор
- Как читать вложенный генератор
- Матрица с разными значениями
- Транспонирование матрицы
- Таблица умножения
- Вложенные генераторы с условиями
- Вложенные генераторы с несколькими циклами
- Матрица с переменной длиной строк
- Задачи для закрепления
- Нюансы и подводные камни
- Читаемость
- Порядок циклов
- Производительность
- Частые ошибки и как их избежать
- Ошибка 1: Неправильный порядок циклов
- Ошибка 2: Забыл квадратные скобки во внутреннем генераторе
- Ошибка 3: Путаница между вложенным генератором и генератором с несколькими циклами
- Шпаргалка
- Заключение / Выводы
- КВИЗ
- Что дальше?
Что нужно знать перед началом
Для этого урока тебе понадобится:
- Установленный Python
- Базовое понимание генераторов списков (статьи 1–3 в этом подменю)
Совет: Вложенные генераторы позволяют создавать многомерные структуры данных в одну строку.
Основная часть
Что такое вложенный генератор
Вложенный генератор — это генератор, который содержит внутри себя другой генератор. Он используется для создания многомерных структур данных.
Синтаксис:
[[выражение for j in итератор2] for i in итератор1]Пример:
# Создание матрицы 3x3 (список из трёх списков по три элемента)
matrix = [[j for j in range(3)] for i in range(3)]
print(matrix) # [[0, 1, 2], [0, 1, 2], [0, 1, 2]]Совет: Внешний цикл создаёт строки, внутренний — столбцы.
Как читать вложенный генератор
matrix = [[j for j in range(3)] for i in range(3)]Пошаговый разбор:
for i in range(3)— внешний цикл (3 раза)[j for j in range(3)]— внутренний генератор (создаёт список из 3 элементов)- Результат: список из трёх списков
Эквивалентный код:
matrix = []
for i in range(3):
row = []
for j in range(3):
row.append(j)
matrix.append(row)
print(matrix) # [[0, 1, 2], [0, 1, 2], [0, 1, 2]]Матрица с разными значениями
# Матрица 3x3 с числами от 0 до 8
matrix = [[i * 3 + j for j in range(3)] for i in range(3)]
print(matrix) # [[0, 1, 2], [3, 4, 5], [6, 7, 8]]Матрица с квадратами:
# Матрица 4x4 с квадратами чисел
matrix = [[(i + 1) ** (j + 1) for j in range(4)] for i in range(4)]
print(matrix)
# [[1, 1, 1, 1],
# [2, 4, 8, 16],
# [3, 9, 27, 81],
# [4, 16, 64, 256]]Транспонирование матрицы
Транспонирование — это переворот матрицы (строки становятся столбцами).
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
transposed = [[row[i] for row in matrix] for i in range(len(matrix[0]))]
print(transposed) # [[1, 4, 7], [2, 5, 8], [3, 6, 9]]Разбор:
for i in range(len(matrix[0]))— перебираем столбцы (0, 1, 2)[row[i] for row in matrix]— берём i-й элемент из каждой строки- Результат: новая матрица, где строки стали столбцами
Совет: Транспонирование часто используется в анализе данных и машинном обучении.
Таблица умножения
table = [[i * j for j in range(1, 10)] for i in range(1, 10)]
for row in table:
print(row)Вывод:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[2, 4, 6, 8, 10, 12, 14, 16, 18]
[3, 6, 9, 12, 15, 18, 21, 24, 27]Вложенные генераторы с условиями
# Только чётные числа в матрице 4x4
matrix = [[j for j in range(4) if j % 2 == 0] for i in range(4)]
print(matrix) # [[0, 2], [0, 2], [0, 2], [0, 2]]Матрица с фильтрацией:
# Квадраты чётных чисел от 0 до 9
matrix = [[j ** 2 for j in range(10) if j % 2 == 0] for i in range(3)]
print(matrix) # [[0, 4, 16, 36, 64], [0, 4, 16, 36, 64], [0, 4, 16, 36, 64]]Вложенные генераторы с несколькими циклами
# Все комбинации двух списков
colors = ["red", "green", "blue"]
sizes = ["S", "M", "L"]
combinations = [[color, size] for color in colors for size in sizes]
print(combinations)
# [['red', 'S'], ['red', 'M'], ['red', 'L'],
# ['green', 'S'], ['green', 'M'], ['green', 'L'],
# ['blue', 'S'], ['blue', 'M'], ['blue', 'L']]Матрица с переменной длиной строк
# Треугольная матрица
matrix = [[i for i in range(row + 1)] for row in range(5)]
print(matrix)
# [[0],
# [0, 1],
# [0, 1, 2],
# [0, 1, 2, 3],
# [0, 1, 2, 3, 4]]Задачи для закрепления
Задача 1. Создай матрицу 3×3, заполненную нулями.
Задача 2. Создай матрицу 4×4 с числами от 0 до 15.
Задача 3. Транспонируй матрицу [[1, 2], [3, 4], [5, 6]].
Задача 4. Создай матрицу 5×5, где каждый элемент равен i * j.
Задача 5. Создай матрицу 3×3 с квадратами чисел, но только для чётных чисел (нечётные замени на 0).
Ответы:
Задача 1.
matrix = [[0 for j in range(3)] for i in range(3)]
print(matrix) # [[0, 0, 0], [0, 0, 0], [0, 0, 0]]Задача 2.
matrix = [[i * 4 + j for j in range(4)] for i in range(4)]
print(matrix) # [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]]Задача 3.
matrix = [[1, 2], [3, 4], [5, 6]]
transposed = [[row[i] for row in matrix] for i in range(len(matrix[0]))]
print(transposed) # [[1, 3, 5], [2, 4, 6]]Задача 4.
matrix = [[i * j for j in range(5)] for i in range(5)]
print(matrix)
# [[0, 0, 0, 0, 0],
# [0, 1, 2, 3, 4],
# [0, 2, 4, 6, 8],
# [0, 3, 6, 9, 12],
# [0, 4, 8, 12, 16]]Задача 5.
matrix = [[j ** 2 if j % 2 == 0 else 0 for j in range(3)] for i in range(3)]
print(matrix) # [[0, 0, 4], [0, 0, 4], [0, 0, 4]]Нюансы и подводные камни
Читаемость
Сложные вложенные генераторы могут быть трудны для понимания. Разбивай их на несколько строк:
matrix = [
[j ** 2 for j in range(5) if j % 2 == 0]
for i in range(4)
]Порядок циклов
Внешний цикл идёт первым, внутренний — вторым.
# Правильно
[[j for j in range(3)] for i in range(3)]
# Неправильно (поменяли местами)
[[i for i in range(3)] for j in range(3)]Производительность
Вложенные генераторы могут быть медленными для больших данных. Для больших матриц используй библиотеку NumPy.
Частые ошибки и как их избежать
Ошибка 1: Неправильный порядок циклов
Внешний цикл — строки, внутренний — столбцы.
Ошибка 2: Забыл квадратные скобки во внутреннем генераторе
Всегда используй [] для внутреннего генератора.
Ошибка 3: Путаница между вложенным генератором и генератором с несколькими циклами
[[j for j in range(3)] for i in range(3)]— создаёт матрицу[j for i in range(3) for j in range(3)]— создаёт плоский список
Шпаргалка
| Что нужно | Как пишется |
|---|---|
| Матрица NxM | [[0 for j in range(M)] for i in range(N)] |
| Матрица с разными значениями | [[i * M + j for j in range(M)] for i in range(N)] |
| Транспонирование | [[row[i] for row in matrix] for i in range(len(matrix[0]))] |
| Матрица с условием | [[j for j in range(M) if cond] for i in range(N)] |
Заключение / Выводы
Сегодня мы:
- Научились создавать вложенные генераторы
- Создавали матрицы и таблицы
- Транспонировали матрицы
- Разобрали сложные примеры








