Вопрос-Ответ

Transpose list of lists

Транспонировать список списков

Давайте возьмем:

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)]
Переведено автоматически
Ответ 1

Python 3:

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

Объяснение:

Есть две вещи, которые нам нужно знать, чтобы понять, что происходит:


  1. Сигнатура zip: zip(*iterables) Это означает zip, что ожидается произвольное количество аргументов, каждый из которых должен быть итерируемым. Например. zip([1, 2], [3, 4], [5, 6]).

  2. Распакованные списки аргументов: учитывая последовательность аргументов args, f(*args) вызовет f такой, что каждый элемент в args является отдельным позиционным аргументом f.

  3. 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 in zip(*l)]
... [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Ответ 3

Один из способов сделать это - с помощью NumPy transpose. Для списка используется:

>>> import numpy as np
>>> np.array(l).T.tolist()
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

Или другой без zip (python < 3):

>>> map(list, map(None, *l))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

Или для python >= 3:

>>> list(map(lambda *x: list(x), *l))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Ответ 4

просто для развлечения, допустимые прямоугольники и предположение, что m[0] существует

>>> m = [[1,2,3],[4,5,6],[7,8,9]]
>>> [[row[i] for row in m] for i in range(len(m[0]))]
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
python list