0

次のようなリストのリストがあります。

a = d[:3]
>>> a
[[90, 26.7328829998, 131075.449348, 473898.809493],
 [90, 78.2985549184, 131116.812991,473929.491012],
 [90, 132.4760969, 131157.881628, 473964.821961]]

順序を変更するには、BIFを-operatorzipと組み合わせて使用​​します。*これはタプルのリストを取得します:

>>> b =zip(*a)
>>> b
[(90, 90, 90),
 (26.7328829998, 78.2985549184, 132.4760969),
 (131075.449348, 131116.812991, 131157.881628),
 (473898.809493, 473929.491012, 473964.821961)]

次のように、アイテムの元の順序を復元したいだけではありません。

>>> c = zip(*b)
>>> c
[(90, 26.7328829998, 131075.449348, 473898.809493),
 (90, 78.2985549184, 131116.812991, 473929.491012),
 (90, 132.4760969, 131157.881628, 473964.821961)] 

リストのリストなど、元のタイプを取得したい場合もあります。しかし、そのトリックzip(*list(b))も実行しませんlist(zip(*b))(2 番目のスニペットが実行されるとは思っていませんでした)。リストをループせずにそこにたどり着く方法を知っている人はいますか!?

4

2 に答える 2

1

izipジェネレーターを返すので、作成時に 2 回ループすることはありませんc。Python 3 ではzip( 、 などもmap)filterデフォルトでジェネレーターを返し、izip削除されました。

>>> from itertools import izip
>>> a = [[90, 26.7328829998, 131075.449348, 473898.809493], [90, 78.2985549184, 131116.812991,473929.491012], [90, 132.4760969, 131157.881628, 473964.821961]]
>>> b = zip(*a)
>>> c = map(list, izip(*b))
>>> c
[[90, 26.7328829998, 131075.449348, 473898.809493], [90, 78.2985549184, 131116.812991, 473929.491012], [90, 132.4760969, 131157.881628, 473964.821961]]
于 2012-07-25T08:42:21.963 に答える
0

代わりに次のいずれかを試してください。

マップの使用:

c = map(list, zip(*b))

またはリスト内包表記:

c = [list(i) for i in zip(*b)]
于 2012-07-25T08:43:50.170 に答える