Транспонирование списка списков в Python: подробное руководство

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для транспонирования списка списков в Python можно использовать функцию zip вместе с оператором распаковки *. Через такую комбинацию будет осуществлена группировка элементов, находящихся на одинаковых позициях в каждом из вложенных списков — это и будет являться транспонированием матрицы. Пример кода:

Python
Скопировать код
transposed = [list(sublist) for sublist in zip(*original)]

Подставим в original значение [[1,2],[3,4]], тогда после транспонирования список transposed будет выглядеть следующим образом: [[1, 3], [2, 4]].

Кинга Идем в IT: пошаговый план для смены профессии

Транспонирование при помощи различных версий Python

В третьей версии Python zip возвращает итератор кортежей, поэтому для вывода совершенно понятного результата их следует преобразовывать в списки:

Python
Скопировать код
transposed = list(map(list, zip(*original)))

В Python 2 функция map сама возвращает список, исключая необходимость производить еще одно преобразование:

Python
Скопировать код
transposed = map(list, zip(*original))

Обработка подсписков разной длины

Если длина ваших списков различается, можно использовать itertools.zip_longest, который дополнит недостающие элементы None или другим значением на ваше усмотрение:

Python
Скопировать код
from itertools import zip_longest
transposed = list(map(list, zip_longest(*original, fillvalue=None)))

Использование NumPy для ускорения процесса

Для транспонирования объемных данных максимально эффективно стоит использовать библиотеку NumPy:

Python
Скопировать код
import numpy as np
transposed = np.transpose(np.array(original)).tolist()

Метод транспонирования в версиях Python до 3

В старых версиях Python для транспонирования списков одной длины был используем такой метод:

Python
Скопировать код
transposed = map(None, *original)

Универсальность версий при помощи Six

Если ваш код должен функционировать в обоих поколениях Python, нужно использовать модуль Six:

Python
Скопировать код
from six.moves import zip_longest
transposed = list(map(list, zip_longest(*original, fillvalue='-')))

Транспонирование через списковые включения

Вариант для тех, кто выделяет в работе использование списковых включений:

Python
Скопировать код
transposed = [[row[i] for row in original] for i in range(len(original[0]))]

Поддержка целостности данных

Всегда следует проверять корректную структурированность всех вложенных списков, иначе транспонирование может привести к искажению данных!

Преобразование результата в список в Python 3

Пользователям Python 3 следует осуществить преобразования результата функции zip() в list(), чтобы получить список, а не итератор.

Подход к колонкам

При транспонировании каждый вложенный список следует воспринимать как колонку в конечной матрице. Персонально следите за данной особенностью при работе с требовательными колонками!

Визуализация

Представим, что у нас есть полки с книгами, которые сгруппированы по жанрам, и мы хотим упорядочить их по авторам:

Перед транспонированием:
Полка 1: [📚🔴, 📚🔵, 📚🟢]
Полка 2: [📚🟡, 📚🟣, 📚🟠]
Полка 3: [📚🔷, 📚🔶, 📚🔺]

Производим транспонирование:

Python
Скопировать код
zip(*shelves)

После транспонирования:

Новая полка A: [📚🔴, 📚🟡, 📚🔷]  — книги, которые были первыми на исходных полках
Новая полка B: [📚🔵, 📚🟣, 📚🔶]  — книги, которые были вторыми на исходных полках
Новая полка C: [📚🟢, 📚🟠, 📚🔺]  — книги, которые были третьими на исходных полках

Теперь строки стали столбцами, а жанры превратились в авторов!

Несколько заметок о транспонировании

Адаптация к разнообразию данных

Сложные наборы данных с элементами разных типов — это не проблема, главное — продумать стратегию транспонирования для их обработки.

Оптимизация процесса перестановки

Наилучший метод транспонирования можно выбрать, продумав структуру ваших данных, избегая тем самым лишних вычислений. Не забывайте, что время — это тоже ресурс!

Применение функционального подхода

Можно преподнести одну историю разными способами, и транспонирование не исключение. Где это возможно, используйте лямбда-выражения.

Полезные материалы

  1. Встроенные функции — Документация Python 3.12.2 — углубленное описание функции zip.
  2. Использование функции Python zip() для параллельной обработки – Real Python — все о функции zip на Python.
  3. Python – Списочное включение — применение списочных включений в Python.
  4. numpy.transpose — Руководство NumPy v1.26 — функция транспонирования многомерных массивов NumPy.
  5. python – Транспонирование списка списков – Stack Overflow — обсуждение темы транспонирования списков на Stack Overflow.
  6. Транспонирование матрицы в Python – Stack Overflow — обсуждение вопроса транспонирования двумерных массивов в Python на Stack Overflow.