2017-07-04 25 views
1

私は、次の辞書に "販売" に該当すべての数字を合計しようとしています:ネストされた辞書を削減

{'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}}} 
# 

出力は次のようになります。6240 + 8869.75 + 15720 + 4184.9 + 6181.7099 + 6080.55

私はキーを1つずつ順番に調べて正しい答えを得ることができますが、これを行うより効率的な方法はありますか?

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

例えば、私はreduceのようなものを使用することによってこれを行うことができます方法はありますか?

おかげ

答えて

3

なぜreduce()あなたは例えば、ジェネレータ式でsum()ことができます。ネストされた形で

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

または代わり:

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

注:あなたがあなたのを呼び出すべきではありませんが変数dictはPythonの組み込みのdictタイプを隠すので、

+0

ありがとうございます。 –

+0

@Blehこのソリューションは、あなたが与えたデータにハードコードされていることを知っておくべきです。あなたのデータが同じ構造を持っているなら、それは大丈夫です。しかし、それが無作為で恣意的であれば、私はあなたに私のことを見てほしい。 –

+0

@cᴏʟᴅswhatどういう意味なのかよくわからないのは、 'sales'キーの下にある毎月の販売データのようです。再帰は、構造化されたデータセットに対して過度の過剰と思われ、OPの質問を不必要に複雑にします。 – AChampion

0

現在のソリューションは、与えられたサンプル入力にハードコードされています。再帰的なアプローチは、は任意の構造化された辞書のために働くことです。

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 

そして、この出力:

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

このアプローチの利点は、ネストの任意の深さのために働くということです。

関連する問題