10 ответов:
как о
map(list, zip(*l)) --> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]для python 3.X пользователи могли использовать
list(map(list, zip(*l)))
один из способов сделать это с NumPy транспонировать. По списку:
>>> import numpy as np >>> np.array(a).T.tolist() [[1, 4, 7], [2, 5, 8], [3, 6, 9]]или еще один без zip:
>>> map(list,map(None,*a)) [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
эквивалентно решению йены:
>>> 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]]
просто для удовольствия, допустимые прямоугольники и предполагая, что 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 2 или 3, и на неровный или прямоугольные список:
настройки
import itertools import six list_list = [[1,2,3], [4,5,6, 6.1, 6.2, 6.3], [7,8,9]]Способ 1
>>> map(list, six.moves.zip_longest(*list_list, fillvalue='-')) [[1, 4, 7], [2, 5, 8], [3, 6, 9], ['-', 6.1, '-'], ['-', 6.2, '-'], ['-', 6.3, '-']]
six.moves.zip_longest()становится
itertools.izip_longest()в Python 2itertools.zip_longest()в Python 3значение по умолчанию fillvalue
None. Спасибо @йены ответ, гдеmap()меняется внутренние кортежи в списки. Здесь итераторы превращаются в списки. Спасибо @орегано и @прпр это комментарии.Способ 2
>>> [list(row) for row in six.moves.zip_longest(*list_list, fillvalue='-')] [[1, 4, 7], [2, 5, 8], [3, 6, 9], ['-', 6.1, '-'], ['-', 6.2, '-'], ['-', 6.3, '-']]The @inspectorG4dget альтернатива.
Способ 3
>>> map(list, map(None, *list_list)) [[1, 4, 7], [2, 5, 8], [3, 6, 9], [None, 6.1, None], [None, 6.2, None], [None, 6.3, None]]внеочередного @SiggyF второй вариант работает с неровными списками (в отличие от его первого, numpy transpose, который проходит через неровные списки), но ни один не является единственным удобным заполнением значение.
(нет, None, переданный на внутреннюю карту (), не является значением заполнения, это означает что-то еще, это означает, что нет функции для передачи строк.)
может быть, не самое элегантное решение, но вот решение с помощью вложенных циклов while:
def transpose(lst): newlist = [] i = 0 while i < len(lst): j = 0 colvec = [] while j < len(lst): colvec.append(lst[j][i]) j = j + 1 newlist.append(colvec) i = i + 1 return newlist
три варианта на выбор:
1. Карта с Zip
solution1 = map(list, zip(*l))2. Понимание Списка
solution2 = [list(i) for i in zip(*l)]3. Для Добавления Цикла
solution3 = [] for i in zip(*l): solution3.append((list(i)))и для просмотра результатов:
print(*solution1) print(*solution2) print(*solution3) # [1, 4, 7], [2, 5, 8], [3, 6, 9]
#Import functions from library from numpy import size, array #Transpose a 2D list def transpose_list_2d(list_in_mat): list_out_mat = [] array_in_mat = array(list_in_mat) array_out_mat = array_in_mat.T nb_lines = size(array_out_mat, 0) for i_line_out in range(0, nb_lines): array_out_line = array_out_mat[i_line_out] list_out_line = list(array_out_line) list_out_mat.append(list_out_line) return list_out_mat
вот решение для транспонирования списка списков, который не обязательно является квадратным:
maxCol = len(l[0]) for row in l: rowLength = len(row) if rowLength > maxCol: maxCol = rowLength lTrans = [] for colIndex in range(maxCol): lTrans.append([]) for row in l: if colIndex < len(row): lTrans[colIndex].append(row[colIndex])
Comments