2017-07-04 3 views
1

Ich versuche, alle Zahlen zu summieren, die unter „Umsatz“ im folgenden Wörterbuch fallen:reduzieren Nested Wörterbuch

{'a': {'sales': {}, 'revenue': {}}, 'b': {'sales': {}, 'revenue': {}}, 'c': {'sales': {'February2017': 6240.0, 'March2017': 8869.75, 'January2017': 15720.0}, 'revenue': {'February2017': 312.0, 'March2017': 432.4, 'January2017': 786.0}}, 'd': {'sales': {'February2017': 4184.9, 'March2017': 6181.709999999999, 'January2017': 6080.55}, 'revenue': {'February2017': 188.86, 'March2017': 292.61, 'January2017': 273.45}}} 
# 

Die Ausgabe sollte sein: 6240 + 8869,75 + 15720 + 4184,9 + 6181,7099 + 6080,55

Ich bin in der Lage, nacheinander durch die Tasten zu schalten und die richtige Antwort zu bekommen, aber gibt es einen effizienteren Weg dies zu tun?

total_sum = 0 
for key,value in dict.items(): 
    for key_a, value_a in value['sales'].items(): 
     total_sum += value_a 

Zum Beispiel ist es eine Möglichkeit, dies wie reduce durch Verwendung etwas tun kann?

Dank

Antwort

3

Warum reduce(), wenn Sie kann sum() mit einem Generator Ausdruck, zB:

>>> sum(sum(value['sales'].values()) for value in data.values()) 
47276.91 

Oder alternativ in verschachtelter Form:

>>> sum(n for value in data.values() for n in value['sales'].values()) 
47276.91 

Hinweis: Sie rufen sollen Ihre Variable dict wie es Python eingebauten dict Typ verbirgt.

+0

Das ist großartig, danke. –

+0

@Bleh Sie sollten wissen, dass diese Lösung für die Daten fest ist, die Sie angegeben haben. Wenn Ihre Daten die gleiche Struktur haben, dann ist das in Ordnung. Aber wenn es zufällig und willkürlich ist, fordere ich Sie auf, auf meinen zu schauen. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ nicht sicher, was Sie meinen, sieht aus wie monatliche Umsatzdaten unter dem 'Verkauf'-Schlüssel. Rekursion scheint für einen strukturierten Datensatz übertrieben zu sein und erschwert die OP-Frage unnötig. – AChampion

0

Die aktuelle Lösung ist fest auf den eingegebenen Probeneingang codiert. Hier ist ein rekursiver Ansatz, der für jedes beliebige strukturierte Wörterbuch funktioniert.

def recursiveSum(data): 
    count = 0 
    if not data: 
     return count 

    elif "sales" in data: 
     for k in data["sales"]: 
      if isinstance(data["sales"][k], dict): 
       count += recursiveSum(data["sales"][k]) 
      else: 
       count += data["sales"][k] 

    else: 
     for k in data: 
      count += recursiveSum(data[k]) 

    return count 

Und diese Ausgänge:

>>> data = {'a': {'sales': {}, 'revenue': {}}, 'b': {'sales': {}, 'revenue': {}}, 'c': {'sales': {'February2017': 6240.0, 'March2017': 8869.75, 'January2017': 15720.0}, 'revenue': {'February2017': 312.0, 'March2017': 432.4, 'January2017': 786.0}}, 'd': {'sales': {'February2017': 4184.9, 'March2017': 6181.709999999999, 'January2017': 6080.55}, 'revenue': {'February2017': 188.86, 'March2017': 292.61, 'January2017': 273.45}}} 
>>> print(recursiveSum(data)) 
47276.91 

Der Vorteil dieses Ansatzes besteht darin, dass es für jede Tiefe geschachtelt werden.