2016-09-29 3 views
0

Mit Python habe ich eine Liste von zwei-Element-Wörterbüchern, die ich alle Werte eines Elements basierend auf den Werten eines anderen Elements zusammenfassen möchte . dh.Summieren der Werte eines Elements eines Wörterbuchs basierend auf den Werten eines anderen Elements

[{'elev': 0.0, 'area': 3.52355755017894}, {'elev': 0.0, 'area': 3.5235575501288667}] 

Dies ist das Format (obwohl es viel mehr Einträge als diese sind), und für jede unterschiedliche elev würde Ich mag die Summe aller area Werte haben, die ihm entsprechen. Für den elev Wert von 0.0 würde ich die Summe aller Werte mag, gleich für elev von 0.1 etc

+1

zurück Hallo, hast du etwas versuchen? – Frodon

+0

Ja Ich versuchte eine for-Schleife innerhalb einer for-Schleife, um über die Elev-Werte zu iterieren und sie mit einem neuen Wörterbuch zu vergleichen, das nur die Höhe und die Anhäufung der Gesamtfläche für diese Höhe speichern würde. Aber es funktionierte nicht bei alle und haben nur eine leere Liste zurückgegeben – McLeodx

+0

Sie können ein anderes Wörterbuch erstellen, in dem der erste Eintrag der Wert von elev und der zweite die Summe aller Bereiche ist, die diesem bestimmten elev-Wert entsprechen. Jetzt durchlaufen Sie einfach Ihre ursprüngliche Liste und ändern Sie Ihre resultierende Liste. – GadaaDhaariGeek

Antwort

2

dies sehr einfach mit Pandas erreicht wird. Beispielcode:

import pandas as pd 
df = pd.DataFrame([{'elev': 0.0, 'area': 3.52355755017894}, {'elev': 0.0, 'area': 3.5235575501288667}]) 

, die folgende Datenrahmen gibt:

 area elev 
0 3.523558 0.0 
1 3.523558 0.0 

Dann Gruppe durch die elev Spalten und Summe der Gegend:

desired_output = df.groupby('elev').sum() 

die gibt:

   area 
elev   
0.0 7.047115 

Wenn Sie wollen, können Sie dann auszahlen ut diesen Datenrahmen zu einem Wörterbuch zurück in einem nützlichen Format:

desired_output.to_dict('index') 

die

{0.0: {'area': 7.0471151003078063}} 
0

Hier ein kurzen Codebeispiel, das die entsprechenden Summen in ein Wörterbuch setzt. Es wird einfach über jedes Wörterbuch in der Eingabeliste iteriert und die Werte area dem entsprechenden Schlüssel elev hinzugefügt.

from collections import defaultdict 

summed_dict = defaultdict(float) 
for tup in input_list: 
    summed_dict[tup['elev']] += tup['area'] 
+0

Mein schlechtes, danke! – Meerness

0

Sie können versuchen:

>>> l = [{'elev': 0.0, 'area': 3.52355755017894}, {'elev': 0.0, 'area': 3.5235575501288667}] 
>>> added_dict = {} 
>>> for i in l: 
     if i['elev'] in added_dict: 
      added_dict[i['elev']] += i['area'] 
     else: 
      added_dict[i['elev']] = i['area'] 


>>> added_dict 
{0.0: 7.0471151003078063} 
1

ein defaultdict verwenden, müssen Sie nicht auf die if/else Aussage:

from collections import defaultdict 

mylist = [{'elev': 0.0, 'area': 3.52355755017894}, {'elev': 0.0, 'area': 3.5235575501288667}] 

sumdict = defaultdict(float) 

for d in mylist: 
    sumdict[d['elev']] += d.get('area', 0.0) 

print dict(sumdict) 
+0

Wie würde ich diese Methode verwenden, um das Wörterbuch mit {'elev': x, 'total': y} zu erstellen? – McLeodx

+0

@McLeodx Ich aktualisierte meine Antwort, wenn der Schlüssel 'Bereich' nicht vorhanden ist – Frodon

+0

@McLeodx: Fügen Sie einfach diese Zeile am Ende hinzu: 'mytotalslist = [{'elv': Schlüssel, 'total': Wert} für Schlüssel, Wert in sumdict.items()] ' – Guillaume

Verwandte Themen