2016-04-26 175 views
4

重組我的後續數據的Python方法是什麼?重新格式化列表中的Python列表

我有一個數據

data = [ 
     ['a','b',1], ['a','b',2], ['a','b',3], 
     ['a','c',3], ['a','c',4], 
     ['f','g',2], ['f','g',5], ['f','g',9] 
     ] 

而且我想把它重新安排到以下格式:

data = [ 
     ['a', 'b', 1, 2, 3], 
     ['a', 'c', 3, 4], 
     ['f', 'g', 2, 5, 9] 
     ] 

所以基本上在每個內部列表這兩個第一要素是區分不同項目的方式,以下數字是數據。我只想爲每個包含所有數據的項目設置一行。

回答

4
import collections 

keyed = collections.defaultdict(list) # (a,b): [1,2,3] 

for k1,k2,val in data: 
    keyed[(k1,k2)].append(val) 

[list(keys) + vals for keys,vals in sorted(keyed.items())] 
1

您可以使用字典分類在每個子列表基於前兩個項目的項目,然後才能使用列表理解來串聯字典的鍵和值:

注意,使用OrderedDict的原因是,它會爲您保存訂單。

>>> from collections import OrderedDict 
>>> d = OrderedDict() 
>>> 
>>> for i, j, k in data: 
...  d.setdefault((i, j), []).append(k) 
... 
>>> [[i,j] + k for (i,j), k in d.items()] 
[['a', 'b', 1, 2, 3], ['a', 'c', 3, 4], ['f', 'g', 2, 5, 9]] 

如果你正在處理大型列表和您關心的內存優化,可以使用groupbychain功能從itertools模塊返回迭代器:

>>> from itertools import groupby, chain 
>>> from operator import itemgetter 
>>> from collections import OrderedDict 

>>> [OrderedDict.fromkeys(chain.from_iterable(g)).keys() for _,g in groupby(data, key=itemgetter(0, 1))] 
[['a', 'b', 1, 2, 3], ['a', 'c', 3, 4], ['f', 'g', 2, 5, 9]]