2017-02-15 5 views
-1

Ich möchte Python intertools groupby verwenden, um eine Funktion zu erstellen, die kleine Listen zu einer größeren Liste zusammenfasst. Was fange ich mit ist eine Liste der verschiedenen Datenpunkte mit der folgenden Struktur (genannt sortedData)Verwenden von itertools groupby zum Sortieren von Listen und Zusammenführen von Wörterbüchern

[ 
    [location, date, {item:quantity}], 
    [location2, date, {item2:quantity2}], 
    ... 
] 

ich sie zu einer Gruppe versuchen, so dass jeder Ort/Datum Kombination ein Wörterbuch mit allen Elementen und Mengen hat, und dass diese Listen sind nach dem Standort gruppiert. Hier ein Beispiel:

[ 
    [ 
    [Maine, 01062016, {apple:5, orange:2}], 
    [Maine, 02042016,{apple:3, peach:2}] 
    ], 
    [ 
    [Vermont, 01032016, {peach:3}] 
    ] 
] 

Was ich habe, so weit ist dieser Code, aber ich habe Probleme zu verstehen, wie die Gruppe zu verwenden, die erstellt wird, da es kein iterable Artikel ist. Jetzt gibt es eine leere Liste, obwohl es so scheint es Dinge anhängen sollte

def compileData(sortedData):  
    from itertools import groupby 
    for key, locationGroup in groupby(sortedData, lambda x: x[0]): 
     locationList=[] 
     bigList=[] 
     for date in locationGroup: 
      locationList.append(date) 
     locationList.append(locationGroup) 
     for key, bigList in groupby(locationGroup, lambda x: x[1]): 
      datePlace=[key[0],key[1],{}] 
      for date in locationGroup: 
       datePlace[2]=dict(list(date[2].items())+list(datePlace[2].items())) 
       bigList.append(datePlace) 
     return bigList 

Lassen Sie mich wissen, was Sie denken, und wenn Sie eine bessere Idee zu haben, wie dieses Problem zu lösen, lassen Sie es mich wissen. Ich habe es rekursiv geschrieben, aber die Datei, auf der ich es verwende, ist zu lang, also ist es zu langsam.

+0

Könnten Sie ein Beispiel hinzufügen, bitte Art der Ausgabe für Sie hoffen? – miradulo

+0

"Verwenden von itertools groupby zum Sortieren" - "iertools.groupby" sortiert nicht. Wenn Sie Dinge sortieren müssen, hilft 'itertools.groupby' Ihnen nicht dabei. Es kann hilfreich sein, um sortierte Daten zu verarbeiten, aber etwas anderes muss sicherstellen, dass die Daten sortiert sind. – user2357112

+0

Hallo Mitch, der zweite Block Zitat hat die Ausgabe, die ich suche. (dh eine Liste von Listen von Listen) –

Antwort

1

Ich denke, das tut, was Sie wollen:

from itertools import groupby 
from operator import itemgetter 

def update_with_ignore(a, b): 
    '''Copy only new entries from B to A''' 
    for k,v in b.items(): 
     a.setdefault(k,v) 

def compileData(sortedData): 
    result = [] 
    sortedData = sorted(sortedData, key=itemgetter(0,1)) 
    for location, group in groupby(sortedData, key=itemgetter(0)): 
     l = [] 
     for date, group in groupby(group, key=itemgetter(1)): 
      d = {} 
      for datum in group: 
       update_with_ignore(d, datum[2]) 
      l.append([location, date, dict(d)]) 
     result.append(l) 
    return result 


in_data = [ 
    ["Maine", "01062016", {"apple":5}], 
    ["Maine", "02042016", {"apple":3}], 
    ["Maine", "01062016", {"orange":2}], 
    ["Vermont", "01032016", {"peach":3}], 
    ["Maine", "02042016", {"peach":2}], 
] 
out_data = compileData(in_data) 
assert out_data == [ 
[['Maine', '01062016', {'apple': 5, 'orange': 2}], 
    ['Maine', '02042016', {'apple': 3, 'peach': 2}]], 
[['Vermont', '01032016', {'peach': 3}]]] 

in_data = [ 
    ["Maine", "01062016", {"apple":5}], 
    ["Maine", "01062016", {"apple":4}], 
    ["Maine", "02042016", {"apple":3}], 
] 
out_data = compileData(in_data) 
assert out_data == [ 
[['Maine', '01062016', {'apple': 5}], 
    ['Maine', '02042016', {'apple': 3}]]] 
+0

Wirklich nett. @ Amelia, wäre das nicht eine bessere Datenstruktur dafür? – Kelvin

+0

Kelvin, meinst du ein Wörterbuch wie folgt zu haben {{location: date): {item: value}} –

+0

Und Rob, vielen Dank. Ich mag Listenverständnis, und ehrlich gesagt bin ich nicht vertraut mit Sammlungen, Operator, Druck oder Assert, also werde ich bei Ihrer zweiten Lösung bleiben. Vielen Dank! –

Verwandte Themen