Давайте принимать:
l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Результат, который я ищу,
r = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
и нет
r = [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
Очень признателен
Как насчет
map(list, zip(*l))
--> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Для Python 3.x пользователи могут использовать
list(map(list, zip(*l)))
Объяснение:
Есть две вещи, которые мы должны знать, чтобы понять, что происходит:
zip(*iterables)
это означает, zip
что ожидается произвольное количество аргументов, каждый из которых должен быть итеративным. Например zip([1, 2], [3, 4], [5, 6])
.args
, f(*args)
будет вызываться так f
, чтобы каждый элемент args
был отдельным позиционным аргументомf
.Возвращаясь к входу из вопроса l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
, zip(*l)
будет эквивалентно zip([1, 2, 3], [4, 5, 6], [7, 8, 9])
. Остальное просто убедитесь, что результатом является список списков, а не список кортежей.
l
размер не является равномерным (скажем, некоторые строки короче других),zip
он не компенсирует это и вместо этого отсекает строки из выходных данных. Такl=[[1,2],[3,4],[5]]
дает тебе[[1,3,5]]
.itertools
Функцияzip_longest()
работает с неровными списками. Смотри ДОКУМЕНТЫlist(zip(*l))
работает правильно в Python 3.zip(*l)
в Python 2), но вы получаете список кортежей, а не список списков. Конечно,list(list(it))
всегда одно и то жеlist(it)
.Один из способов сделать это с помощью транспонирования NumPy. Для списка:
Или другой без почтового индекса:
источник
map
, что смогу это сделать Вот небольшое уточнение , которое не требует 2 вызова, хотя:map(lambda *a: list(a), *l)
map(None, ...)
не похоже на работу для Py3. Генератор создается , ноnext()
сразу же выдает ошибку:TypeError: 'NoneType' object is not callable
.Эквивалентно решению Йены:
источник
map()
, это решение является наиболее подходящим для духа Python ...просто для удовольствия, действительные прямоугольники и предполагая, что m [0] существует
источник
[[j[i] for j in l] for i in range(len(l[0]))]
. Конечно, вы должны быть уверены, что списокl
не пуст.Методы 1 и 2 работают в Python 2 или 3, и они работают на рваных, прямоугольных 2D-списками. Это означает, что внутренние списки не должны иметь одинаковую длину (рваные) или внешние списки (прямоугольные). Другие методы, ну, это сложно.
установка
способ 1 -
map()
,zip_longest()
six.moves.zip_longest()
становитсяitertools.izip_longest()
в Python 2itertools.zip_longest()
в Python 3По умолчанию fillvalue есть
None
. Благодаря ответу @ jena , гдеmap()
происходит изменение внутренних кортежей в списки. Здесь он превращает итераторы в списки. Благодаря комментариям @ Oregano и @ badp .В Python 3 передайте результат,
list()
чтобы получить тот же 2D-список, что и в методе 2.метод 2 - понимание списка,
zip_longest()
@ InspectorG4dget альтернатива .
Метод 3 -
map()
изmap()
- сломан в Python 3.6Эта необычайно компактная вторая альтернатива @SiggyF работает с рваными 2D-списками, в отличие от его первого кода, который использует numpy для транспонирования и прохождения через рваные списки. Но None не должно быть значением заполнения. (Нет, None, передаваемый внутренней карте (), не является значением заполнения. Это означает, что нет функции для обработки каждого столбца. Столбцы просто передаются во внешнюю карту (), которая преобразует их из кортежей в списки.
Где-то в Python 3
map()
перестали мириться со всем этим злоупотреблением: первым параметром не может быть None, а рваные итераторы просто усекаются до самых коротких. Другие методы все еще работают, потому что это относится только к внутренней карте ().Метод 4 -
map()
изmap()
вновьУвы, рваные строки НЕ становятся рваными столбцами в Python 3, они просто усекаются. Бу Ху прогресс.
источник
Три варианта на выбор:
1. Карта с Zip
2. Понимание списка
3. Для добавления петли
И для просмотра результатов:
источник
Возможно, не самое элегантное решение, но вот решение, использующее вложенные циклы while:
источник
источник
more_itertools.unzip()
легко читается, и это также работает с генераторами.или эквивалентно
источник
Вот решение для транспонирования списка списков, который не обязательно квадратный:
источник
источник