名前付きタプルの2次元リストを持っています(それぞれのタプルにN値があるとします)、それらをN個の異なる2次元リストに展開したい-Dリストは、元のリストの単一の属性から完全に構成されています。私はこの2-Dのリストを持っている場合たとえば:私はちょうど私が使用したいタプルの1次元のリストを持っていた場合Pythonは名前付きタプルの2次元リストを展開します
[[0, 1, 2],
[3, 4, 5],
[6, 7, 8]]
[[0.0, 1.0, 2.0],
[3.0, 4.0, 5.0],
[6.0, 7.0, 8.0]]
[['0', '1', '2'],
['3', '4', '5'],
['6', '7', '8']]
:
>>> combo = namedtuple('combo', 'i, f, s')
>>> combo_mat = [[combo(i + 3*j, float(i + 3*j), str(i + 3*j)) for i in range(3)]
for j in range(3)]
>>> combo_mat
[[combo(i=0, f=0.0, s='0'), combo(i=1, f=1.0, s='1'), combo(i=2, f=2.0, s='2')],
[combo(i=3, f=3.0, s='3'), combo(i=4, f=4.0, s='4'), combo(i=5, f=5.0, s='5')],
[combo(i=6, f=6.0, s='6'), combo(i=7, f=7.0, s='7'), combo(i=8, f=8.0, s='8')]]
私がする3件の結果をみたいです以下のようなzip(*mylist)
、:
>>> zip(*[combo(i=0, f=0.0, s='0'), combo(i=1, f=1.0, s='1'), combo(i=2, f=2.0, s='2')])
[(0, 1, 2), (0.0, 1.0, 2.0), ('0', '1', '2')]
そして私はちょうどネスティングによって私の状況にこれを拡張することができます。
>>> zip(*[zip(*combs) for combs in combo_mat])
[((0, 1, 2),
(3, 4, 5),
(6, 7, 8)),
((0.0, 1.0, 2.0),
(3.0, 4.0, 5.0),
(6.0, 7.0, 8.0)),
(('0', '1', '2'),
('3', '4', '5'),
('6', '7', '8'))]
しかし、これは私が望むリストを私に与えてくれないし、ネストされたアンパックzip(*)
関数はそれを読むことができません。誰かがもっとpythonicソリューションのためのアイデアを持っていますか?ボーナスは、最終結果のどこかでタプルの属性の名前を処理できる場合に発生します。これは、することができ
{'i': [[0, 1, 2],
[3, 4, 5],
[6, 7, 8]],
'f': [[0.0, 1.0, 2.0],
[3.0, 4.0, 5.0],
[6.0, 7.0, 8.0]]
's': [['0', '1', '2'],
['3', '4', '5'],
['6', '7', '8']]}
優れています。プライベート変数 '_fields'を列挙するのではなく、' getattr() 'を使うのが好きです。それはより清潔に見える。 –
私はもともと 'getattr'を鉱山で使っていましたが、' getattr'はきれいではないと感じました。:-) – kindall
私はまだ '_fields'を使います。それがなければ名前付きタプルのフィールド名のリストを取得する方法があるかどうかは分かりません。 – Claudiu