Вложенные генераторы списков

Вложенные генераторы списков Генераторы списков и словарей

Привет! Мы уже научились создавать простые генераторы списков. Но что, если нужно создать список списков (матрицу) или обработать данные с несколькими уровнями вложенности? Здесь на помощь приходят вложенные генераторы.

В этой статье мы разберём:

  • Что такое вложенные генераторы
  • Как создавать матрицы
  • Как работать с несколькими циклами
  • Транспонирование матриц

Что нужно знать перед началом

Для этого урока тебе понадобится:

  • Установленный 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)]

Пошаговый разбор:

  1. for i in range(3) — внешний цикл (3 раза)
  2. [j for j in range(3)] — внутренний генератор (создаёт список из 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]]

Разбор:

  1. for i in range(len(matrix[0])) — перебираем столбцы (0, 1, 2)
  2. [row[i] for row in matrix] — берём i-й элемент из каждой строки
  3. Результат: новая матрица, где строки стали столбцами

Совет: Транспонирование часто используется в анализе данных и машинном обучении.

Таблица умножения

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)]

Заключение / Выводы

Сегодня мы:

  • Научились создавать вложенные генераторы
  • Создавали матрицы и таблицы
  • Транспонировали матрицы
  • Разобрали сложные примеры

КВИЗ

Что дальше?

Оцените статью
IMI-DS - PYTHON LERNEN
Содержание
Оглавление ×