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



давайте:



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


ценится

680   10  

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() становится

значение по умолчанию 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])
import numpy as np
r = list(map(list, np.transpose(l)))

Comments

    Ничего не найдено.