3

N個のリストのリストがあり、各サブリストにはM個の要素が含まれています。

最初のリストのn番目の要素を含む、それぞれN個の要素を持つM個のリストのリストを作成するにはどうすればよいですか?

私がこれを持っているとしましょう

myList = [[1, 2, 3],[4, 5, 6]]

欲しい

[[1, 4],[2, 5],[3, 6]]

パフォーマンスも重要です。私は数百万の要素のサブリストを持っています(ただし、1つの次元は常に小さくなります:1.000.000 x 8のように)

4

5 に答える 5

3

これによりタプルが作成されますが、これを拡張してリストを含めるのは簡単です。

zip(*myList)

すなわち

[list(i) for i in zip(*myList)]
于 2013-03-18T09:56:01.370 に答える
3
>>> lst = [[1, 2, 3], [4, 5, 6]]
>>> zip(*lst)
[(1, 4), (2, 5), (3, 6)]

zipPython 2 ではリストを返しますが、Python 3 ではイテレータを返します。必要に応じてリストに変換する必要があります ( list(zip(lst)))

参照: Python の行列転置転置/解凍関数 (zip の逆)?


演算子を使用する要素を関数の個別の引数zip(*lst)にアンパックします。lst*zip

2 つのリストを入れるとどうなるかはわかっています。

>>> zip([1, 2, 3], [4, 5, 6])
[(1, 4), (2, 5), (3, 6)]

したがって、これら 2 つのリストを含むリストがある場合、 はリスト*をアンパックして 2 つの別個の引数を形成します。これは上記の呼び出しと同等です。

>>> zip(*[[1, 2, 3], [4, 5, 6]])
[(1, 4), (2, 5), (3, 6)]
于 2013-03-18T09:56:18.903 に答える
3

使用する

myList = [[1, 2, 3],[4, 5, 6]] 
zip(*myList )
于 2013-03-18T09:56:47.510 に答える
2

おそらくitertools.izip()の助けを借りて

itertools.izip(*myList)

この反復子からリストを作成するには、次のようにします。

map(list, itertools.izip(*myList))
于 2013-03-18T09:56:38.123 に答える
0

あなたが効率性について言及したので、私はこれらをPyPyで試してみましたが、100x1000前後のどこかでより良くなり始めましたzip(CPythonではより悪いですが):

myList = [[1, 2, 3],[4, 5, 6]]
newList = [[] for _ in xrange(len(myList[0]))]
    for innerList in myList:
        for elIdx in xrange(len(innerList)):
            newList[elIdx].append(innerList[elIdx])

print newList

そして、私の最初の試み(これはさらに悪い)ですが、zipPyPy よりも優れています。

newList = [[None for i in xrange(len(myList))] for j in xrange(len(myList[0]))]
for i in xrange(len(myList)):
    for j in xrange(len(myList[i])):
        newList[j][i] = myList[i][j]

print newList
于 2013-03-18T10:00:33.753 に答える