# short circuits at shortest nested list if table is jagged: list(map(list, zip(*l)))
# discards no data if jagged and fills short nested lists with None list(map(list, itertools.zip_longest(*l, fillvalue=None)))
Python 2:
map(list, zip(*l))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Объяснение:
Есть две вещи, которые нам нужно знать, чтобы понять, что происходит:
Сигнатура zip: zip(*iterables) Это означает zip, что ожидается произвольное количество аргументов, каждый из которых должен быть итерируемым. Например. zip([1, 2], [3, 4], [5, 6]).
Распакованные списки аргументов: учитывая последовательность аргументов args, f(*args) вызовет f такой, что каждый элемент в args является отдельным позиционным аргументом f.
itertools.zip_longest не удаляет никакие данные, если количество элементов во вложенных списках неодинаково (однородно), и вместо этого заполняет более короткие вложенные списки, затем архивирует их.
Возвращаясь к входным данным из вопроса l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]], zip(*l) было бы эквивалентно zip([1, 2, 3], [4, 5, 6], [7, 8, 9]). Остальное - просто убедиться, что результатом является список списков, а не список кортежей.
Ответ 2
Эквивалентно решению Jena:
>>> l=[[1,2,3],[4,5,6],[7,8,9]] >>> [list(i) for i inzip(*l)] ... [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Ответ 3
Один из способов сделать это - с помощью NumPy transpose. Для списка используется: