Транспонирование списка списков в Python: подробное руководство
Быстрый ответ
Для транспонирования списка списков в Python можно использовать функцию zip
вместе с оператором распаковки *
. Через такую комбинацию будет осуществлена группировка элементов, находящихся на одинаковых позициях в каждом из вложенных списков — это и будет являться транспонированием матрицы. Пример кода:
transposed = [list(sublist) for sublist in zip(*original)]
Подставим в original
значение [[1,2],[3,4]]
, тогда после транспонирования список transposed
будет выглядеть следующим образом: [[1, 3], [2, 4]]
.
Транспонирование при помощи различных версий Python
В третьей версии Python zip
возвращает итератор кортежей, поэтому для вывода совершенно понятного результата их следует преобразовывать в списки:
transposed = list(map(list, zip(*original)))
В Python 2 функция map
сама возвращает список, исключая необходимость производить еще одно преобразование:
transposed = map(list, zip(*original))
Обработка подсписков разной длины
Если длина ваших списков различается, можно использовать itertools.zip_longest
, который дополнит недостающие элементы None
или другим значением на ваше усмотрение:
from itertools import zip_longest
transposed = list(map(list, zip_longest(*original, fillvalue=None)))
Использование NumPy для ускорения процесса
Для транспонирования объемных данных максимально эффективно стоит использовать библиотеку NumPy:
import numpy as np
transposed = np.transpose(np.array(original)).tolist()
Метод транспонирования в версиях Python до 3
В старых версиях Python для транспонирования списков одной длины был используем такой метод:
transposed = map(None, *original)
Универсальность версий при помощи Six
Если ваш код должен функционировать в обоих поколениях Python, нужно использовать модуль Six:
from six.moves import zip_longest
transposed = list(map(list, zip_longest(*original, fillvalue='-')))
Транспонирование через списковые включения
Вариант для тех, кто выделяет в работе использование списковых включений:
transposed = [[row[i] for row in original] for i in range(len(original[0]))]
Поддержка целостности данных
Всегда следует проверять корректную структурированность всех вложенных списков, иначе транспонирование может привести к искажению данных!
Преобразование результата в список в Python 3
Пользователям Python 3 следует осуществить преобразования результата функции zip()
в list()
, чтобы получить список, а не итератор.
Подход к колонкам
При транспонировании каждый вложенный список следует воспринимать как колонку в конечной матрице. Персонально следите за данной особенностью при работе с требовательными колонками!
Визуализация
Представим, что у нас есть полки с книгами, которые сгруппированы по жанрам, и мы хотим упорядочить их по авторам:
Перед транспонированием:
Полка 1: [📚🔴, 📚🔵, 📚🟢]
Полка 2: [📚🟡, 📚🟣, 📚🟠]
Полка 3: [📚🔷, 📚🔶, 📚🔺]
Производим транспонирование:
zip(*shelves)
После транспонирования:
Новая полка A: [📚🔴, 📚🟡, 📚🔷] — книги, которые были первыми на исходных полках
Новая полка B: [📚🔵, 📚🟣, 📚🔶] — книги, которые были вторыми на исходных полках
Новая полка C: [📚🟢, 📚🟠, 📚🔺] — книги, которые были третьими на исходных полках
Теперь строки стали столбцами, а жанры превратились в авторов!
Несколько заметок о транспонировании
Адаптация к разнообразию данных
Сложные наборы данных с элементами разных типов — это не проблема, главное — продумать стратегию транспонирования для их обработки.
Оптимизация процесса перестановки
Наилучший метод транспонирования можно выбрать, продумав структуру ваших данных, избегая тем самым лишних вычислений. Не забывайте, что время — это тоже ресурс!
Применение функционального подхода
Можно преподнести одну историю разными способами, и транспонирование не исключение. Где это возможно, используйте лямбда-выражения.
Полезные материалы
- Встроенные функции — Документация Python 3.12.2 — углубленное описание функции zip.
- Использование функции Python zip() для параллельной обработки – Real Python — все о функции zip на Python.
- Python – Списочное включение — применение списочных включений в Python.
- numpy.transpose — Руководство NumPy v1.26 — функция транспонирования многомерных массивов NumPy.
- python – Транспонирование списка списков – Stack Overflow — обсуждение темы транспонирования списков на Stack Overflow.
- Транспонирование матрицы в Python – Stack Overflow — обсуждение вопроса транспонирования двумерных массивов в Python на Stack Overflow.