2016-04-26 25 views
4

Was ist die Python-Art, um meine folgenden Daten zu reorganisieren?Python-Liste in Liste Neuformatierung

Ich habe ein Datum

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

Und ich mag es folgendes Format neu zu ordnen:

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

Also im Grunde dieser beide ersten Elemente in jeder inneren Liste ist die Art und Weise verschiedene Elemente zu unterscheiden und folgende Nummer sind die Daten. Ich möchte nur eine Zeile für jeden Artikel haben, der alle Daten enthält.

Antwort

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

Sie ein Wörterbuch zum Kategorisieren der Elemente in jeder Unterliste basiert auf den ersten beiden Elemente können dann eine Liste Verständnis verwenden, um die dict die Schlüssel und Werte verketten:

Beachten Sie, dass der Grund OrderedDict der Verwendung ist, dass Es wird die Bestellung für Sie erhalten.

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

Wenn Sie mit großen Listen handelt und Sie kümmern uns um die Speicher-Optimierung, können Sie groupby und chain Funktionen von itertools Modul verwenden, die Iterator zurück:

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