해 보자:
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)))
설명:
무슨 일이 일어나고 있는지 이해하기 위해 알아야 할 두 가지가 있습니다.
- zip 의 서명 :
zip(*iterables)
이것은zip
각각 반복 가능 해야하는 임의의 수의 인수를 예상 한다는 것을 의미 합니다. 예zip([1, 2], [3, 4], [5, 6])
. - 압축을 푼 인수 목록 : 인수의 순서 감안할는
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()
된다
itertools.izip_longest()
파이썬 2에서itertools.zip_longest()
파이썬 3에서
기본 채우기 값은 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, '-']]
방법 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