web-dev-qa-db-ja.com

リストの転置リスト

取りましょう:

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

とても有難い

179
titus

どう?

map(list, Zip(*l))
--> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

python 3.xユーザーは次を使用できます

list(map(list, Zip(*l)))
244
jena

それを行う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]]
51
SiggyF

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

楽しみのための有効な長方形で、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]]
23
matchew

これらのメソッドはすべて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(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です。 @jenaの answer のおかげで、map()は内部タプルをリストに変更しています。ここでは、イテレータをリストに変えています。 @Oreganoと@badpの comments に感謝します。

方法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, '-']]

@ inspectorG4dget alternative

方法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 2番目の選択肢 は、numpyの転置を使用して不規則なリストを通過する最初のコードとは異なり、不規則な2Dリストで動作します。ただし、なしは塗りつぶし値である必要があります。 (いいえ、内側のmap()に渡されるNoneはフィル値ではありません。これは、行を渡す関数がないことを意味します。)

17
Bob Stein

から選択する3つのオプション:

1. Zipを使用した地図

solution1 = map(list, Zip(*l))

2.リストの理解

solution2 = [list(i) for i in Zip(*l)]

3. Forループ追加

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

おそらく最もエレガントなソリューションではありませんが、ネストされた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
footballman2399
import numpy as np
r = list(map(list, np.transpose(l)))
0
reza.cse08