3

だから私はPythonでこのリストを持っています、

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

リストの読み取り値を水平方向から垂直方向に回転させたい。

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

それを行うための最良の方法、そしてそれを行うための最も効率的な方法は何ですか?私はプログラミングにかなり慣れていません。初心者でごめんなさい。ありがとう。

4

4 に答える 4

10

あなたはそのようにそれを行うことができます:

zip(*your_list)

証拠:

>>> a = [[1, 2, 3, 4], [2, 4, 5, 1], [3, 4, 6, 2], [2, 3, 4, 5]]
>>> zip(*a)
[(1, 2, 3, 2), (2, 4, 4, 3), (3, 5, 6, 4), (4, 1, 2, 5)]
于 2012-09-22T05:46:38.000 に答える
8

numpyライブラリをチェックしてください。リストを配列に入れて、次のように転置することができます。

a = array ([[1,2,3,4],
       [2,4,5,1],
       [3,4,6,2],
       [2,3,4,5]])
a.transpose()

PS:Tadeckのソリューションの説明は非常に簡単です。zip次の署名があります。

zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]

したがって、いくつかのシーケンスを取得し(正確な量はわかりません)、次の順序でタプルを構築します。すべてのシーケンスの最初の要素を取得し、それらをタプルに配置し、次にすべてのシーケンスの2番目の要素を取得して配置します。 2番目のタプルなど。実行中に作成したすべてのタプルのリストを返します。

*lst-実際には、引数リストの解凍です。詳細については、次のメモをご覧ください。

これで、このかわいいコードがどのように機能するかを誰もが理解できるようになることを願っています。:)

于 2012-09-22T05:47:44.330 に答える
5

あなたは効率について尋ねました。そのためにtimeitを使用できます。

>python -m timeit -s "a = [[1,2,3,4],[2,4,5,1],[3,4,6,2],[2,3,4,5]]" "zip(*a)"
1000000 loops, best of 3: 0.569 usec per loop

>python -m timeit -s "a = [[1,2,3,4],[2,4,5,1],[3,4,6,2],[2,3,4,5]]" "map(None, *a)"
1000000 loops, best of 3: 0.644 usec per loop    

>python -m timeit -s "a = [[1,2,3,4],[2,4,5,1],[3,4,6,2],[2,3,4,5]]" "[[row[i] for row in a] for i in xrange(len(a[0]))]"
1000000 loops, best of 3: 1.43 usec per loop    

>python -m timeit -s "from numpy import array; a = array([[1,2,3,4],[2,4,5,1],[3,4,6,2],[2,3,4,5]])" "a.transpose()"
1000000 loops, best of 3: 0.249 usec per loop

の大規模なデータセットの場合[[1,2,3,4],[2,4,5,1],[3,4,6,2],[2,3,4,5]]*1000000

>python -m timeit -s "a = [[1,2,3,4],[2,4,5,1],[3,4,6,2],[2,3,4,5]]*1000000" "zip(*a)"
10 loops, best of 3: 400 msec per loop

>python -m timeit -s "a = [[1,2,3,4],[2,4,5,1],[3,4,6,2],[2,3,4,5]]*1000000" "map(None, *a)"
10 loops, best of 3: 458 msec per loop

>python -m timeit -s "a = [[1,2,3,4],[2,4,5,1],[3,4,6,2],[2,3,4,5]]*1000000" "[[row[i] for row in a] for i in xrange(len(a[0]))]"
10 loops, best of 3: 770 msec per loop

>python -m timeit -s "from numpy import array; a = array([[1,2,3,4],[2,4,5,1],[3,4,6,2],[2,3,4,5]]*1000000)" "a.transpose()"
1000000 loops, best of 3: 0.251 usec per loop

リストの長さが異なる場合はzip、最短の長さに切り捨てます。'map'を使用するかitertools.izip_longest、代わりに欠落している値を。で埋めることができますNone

于 2012-09-22T06:38:59.920 に答える
1

別の方法は次のとおりです。

a=  [[1,2,3,4],
     [2,4,5,1],
     [3,4,6,2],
     [2,3,4,5]]
a = [[row[i] for row in a] for i in range(len(a[0]))]
于 2012-09-22T06:11:15.987 に答える