2016-04-26 14 views
4

私の次のデータを再構成するにはどうしたらいいですか?リスト形式の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] 
     ] 

だから、基本的には、各内側のリストでは、これら二つの第一の要素と次の番号はデータです。私は、すべてのデータを含む各項目ごとに1つの行が必要です。

注意をOrderedDictを使用しての理由があることであること:

答えて

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

次に、辞書のキーと値を連結するために、リストの内包表記を使用し、各サブリスト内の最初の2つの項目に基づいてアイテムを分類するための辞書を使用することができますあなたのために注文を保存します。

>>> 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]] 

あなたは大きなリストを扱っている、あなたはメモリの最適化を気にする場合は、イテレータを返すitertoolsモジュールからgroupbychain機能を使用することができます。

>>> 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]]