2016-09-11 16 views
-1

の合計リストに私を助けてください:)グループ化と辞書Pythonの

のPython 3.5

私は辞書のリストがあります:

[ 

    { 
    'A':'string1', 'metric1':sum(all metric1 where 'A'='string1'), 
    'metric2':sum(all metric2 where 'A'='string1'), 
    'B': [ 

      { 
      'B':'string_5', 
      'metric1':sum(all metric1 for combination where 'A' in 
            'string1' and 'B' in string_5), 
      'metric2':sum(all metric2 , where combination Similarly 'metric1'), 
      'C':[ 

       { 
        'C':'string_9', 'metric1':sum(all metric_1 for 
      combination where 'A' in` 'string1' and 'B' in string_5 and 'C' is 'string_9'), 
        'metric2':sum(...) 
        }, 
        { 
        'C':'string_11', 
        'metric1':sum(...) 
        'metric2':sum(..) 
        } 
       ] 

      } 
     ] 
    }, 
    { 
     'A':'string_2', 'metric1':sum(all metric1 where 'A'='string2'), 
     'metric2':sum(...), 
     'B': [ 

       { 
       'B':'string_7','metric1':sum(all metric1 for 
      combination where 'A'='string_2' and 'B'='string_7'), 
       'metric2':'sum(...), 
       'C': [ 
         { 
         'C':'string_15', 
          'metric1' :sum(...), 
         'metric2':'sum(...) 
         } 
        ] 
       } 
      ] 
     }, 

.... 

    ..... 
] 
:出力で

[ 

    { 
     'A':'string1', 
     'B':'string_5', 
     'C':'string_9, 
     ... 
     'N':'stringN', 
     'metric1':5, 
     'metric2':7 
    }, 

    { 
    'A':'string1', 
    'B':'string_5', 
    'C':'string_11,... 
    'N':'stringN', 
    'metric1':10, 
    'metric2':45 
    }, 

    { 
    'A':'string2', 
    'B':'string_7', 
    'C':'string_15, 
     ... 
    'N':'stringN', 
    'metric1':234, 
    'metric2':78 
    }, 

    ....... 
] 

を私が取得したいです

したがって、出力には各レベルキー(A、B、C、... N)の入力をグループ化し、各グループのすべてのメトリック値を合計する必要があります。各親レベル辞書には、次のグループ化されたレベル要素の配列の値を持つ次のレベルの名前を持つキーがあります。ここで要素の親はこのキーです。

Аnyソリューション?

+1

希望する出力の基本的な考え方を説明してください。私たちはそれを理解するために多大な時間を費やす必要はありません。 –

+0

@RoryDaultonさて、私の質問を編集しました – SmartSt

答えて

0

など、私はツリーとしてループ入力辞書の呼び出し再帰関数を試みたんだけど、1つの分岐のみをグループ化して、次の分岐に一つだけの枝ところ、私は結果を得る私の同僚は、解決策を見つけるために私を助けて。

def generate_level(dicts, level, levels): 
    level2dicts = defaultdict(list) # level value -> dicts 
    for d in dicts: 
     level2dicts[d[level]].append(d) 

    if not levels: # the deepest level 
     return {level: [{level: level_value, **sum_metrics(level_dicts)} 
         for level_value, level_dicts in level2dicts.items()]} 

    inner_level, *levels = levels # pop level 
    inner_dicts = (generate_level(level_dicts, inner_level, levels) 
        for level_dicts in level2dicts.values()) 
    return {level: [{level: level_value, 
        **sum_metrics(level_dict[inner_level]), 
        **level_dict} 
        for level_value, level_dict in zip(level2dicts, inner_dicts)]} 

level, *nested_levels = order 
print(generate_level(dicts, level, nested_levels)[level]) 

'注文' - dicts

結果の入力リスト - キー(レベル順)、 'dicts' の順序付きリスト:すべての人のマイナス、私の質問のための

[{'A': 'string1', 
    'B': [{'B': 'string_5', 
     'C': [{'C': 'string_9', 'metric1': 5, 'metric2': 7}, 
       {'C': 'string_11', 'metric1': 10, 'metric2': 45}], 
     'metric1': 15, 
     'metric2': 52}], 
    'metric1': 15, 
    'metric2': 52}, 
{'A': 'string2', 
    'B': [{'B': 'string_7', 
     'C': [{'C': 'string_15', 'metric1': 234, 'metric2': 78}], 
     'metric1': 234, 
     'metric2': 78}], 
    'metric1': 234, 
    'metric2': 78}] 

ありがとう! @Rory Daulton