取りましょう:
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]]
python 3.xユーザーは次を使用できます
list(map(list, Zip(*l)))
それを行う1つの方法は、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]]
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]]
楽しみのための有効な長方形で、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で機能します。また、「不規則な」長方形の2Dリストで機能します。つまり、内部リストは同じ長さである必要はありません。
import itertools
import six
list_list = [[1,2,3], [4,5,6, 6.1, 6.2, 6.3], [7,8,9]]
>>> 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()
in Python 2itertools.Zip_longest()
in Python 3デフォルトのfillvalueはNone
です。 @jenaの answer のおかげで、map()
は内部タプルをリストに変更しています。ここでは、イテレータをリストに変えています。 @Oreganoと@badpの comments に感謝します。
>>> [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 alternative 。
>>> 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 2番目の選択肢 は、numpyの転置を使用して不規則なリストを通過する最初のコードとは異なり、不規則な2Dリストで動作します。ただし、なしは塗りつぶし値である必要があります。 (いいえ、内側のmap()に渡されるNoneはフィル値ではありません。これは、行を渡す関数がないことを意味します。)
solution1 = map(list, Zip(*l))
solution2 = [list(i) for i in Zip(*l)]
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
import numpy as np
r = list(map(list, np.transpose(l)))