[python] 목록의 전치

해 보자:

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

파이썬 3.x의 경우 사용자는

list(map(list, zip(*l)))

설명:

무슨 일이 일어나고 있는지 이해하기 위해 알아야 할 두 가지가 있습니다.

  1. zip 의 서명 : zip(*iterables)이것은 zip각각 반복 가능 해야하는 임의의 수의 인수를 예상 한다는 것을 의미 합니다. 예 zip([1, 2], [3, 4], [5, 6]).
  2. 압축을 푼 인수 목록 : 인수의 순서 감안할는 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]). 나머지는 결과가 튜플 목록 대신 목록 목록인지 확인하는 것입니다.


답변

이를 수행하는 한 가지 방법은 NumPy 조옮김입니다. 목록의 경우 :

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

또는 우편 번호가없는 다른 제품 :

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


답변

방법 1과 2는 Python 2 또는 3에서 작동하며 거친 사각형 2D 목록 에서 작동 합니다. 즉, 내부 목록의 길이가 서로 같거나 (비정형) 외부 목록 (직사각형) 일 필요는 없습니다. 다른 방법은 복잡합니다.

설정

import itertools
import six

list_list = [[1,2,3], [4,5,6, 6.1, 6.2, 6.3], [7,8,9]]

방법 1 — map(),zip_longest()

>>> list(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() 된다

기본 채우기 값은 None입니다. 예나의 @ 덕분에 대답 , 어디 map()목록에 내부 튜플을 변화하고 있습니다. 여기서 반복자를 목록으로 바꿉니다. @Oregano와 @badp의 의견에 감사드립니다 .

Python 3에서는 list()메소드 2와 동일한 2D 목록을 얻기 위해 결과를 전달하십시오 .


방법 2 — 목록 이해, zip_longest()

>>> [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, '-']]

@의 inspectorG4dget 대안 .


방법 3 — map()of map()Python 3.6에서 중단

>>> 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를 사용하여 거친 목록을 바꾸고 통과하는 첫 번째 코드와 달리 거친 2D 목록과 함께 작동합니다. 그러나 없음은 채우기 값이어야합니다. (아니요, 내부 map ()에 전달 된 None은 채우기 값이 아닙니다. 이는 각 열을 처리하는 함수가 없음을 의미합니다. 열은 외부 맵 ()으로 전달되어 튜플에서 목록으로 변환됩니다.

파이썬 3 어딘가 map()에서이 모든 남용을 참지 못했습니다. 첫 번째 매개 변수는 None이 될 수 없으며 거친 반복자가 가장 짧게 잘립니다. 다른 방법은 내부 map ()에만 적용되므로 여전히 작동합니다.


방법 4 – map()map()재검토

>>> list(map(list, map(lambda *args: args, *list_list)))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]   // Python 2.7
[[1, 4, 7], [2, 5, 8], [3, 6, 9], [None, 6.1, None], [None, 6.2, None], [None, 6.3, None]] // 3.6+

슬프게도 비정형 행은 Python 3에서 비정형 열이되지 않으며 잘립니다. 부후 진행.


답변

선택할 수있는 세 가지 옵션 :

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]


답변

아마도 가장 우아한 솔루션은 아니지만 중첩 된 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