我有一個名爲元組(假設每個元組有N個值)的2維列表,我想他們解壓到N個不同的2維列出每個解壓2 -D列表完全由原始列表中的單個屬性組成。例如,如果我有這樣的2-d列表:Python的解壓命名元組的2維列表
>>> 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個結果是:
[[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']]
如果我只是有一個元組的1維列表我會使用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']]}
非常好,我喜歡使用'getattr()'而不是枚舉私有變量'_fields'。它看起來更清潔。 –
我原本在我的'getattr'中使用過,但覺得'getattr'不夠乾淨。:-) – kindall
我仍然使用'_fields'。不知道是否有辦法得到沒有它的命名元組字段名稱的列表 – Claudiu