Python字典的分组和求和列表

Python字典的分组和求和列表,python,list,dictionary,recursion,grouping,Python,List,Dictionary,Recursion,Grouping,请帮帮我:) Python 3.5 我有一份清单: [ { 'A':'string1', 'B':'string_5', 'C':'string_9, ... 'N':'stringN', 'metric1':5, 'metric2':7 }, { 'A':'string1', 'B':'string_5', 'C':'string_11,... 'N

请帮帮我:)

Python 3.5

我有一份清单:

[

  {
      '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':'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、B、C、…N)的输入进行分组,并对每个分组的所有度量值求和。在每个父级dict中,它都有一个名为next level的键,该键的值是下一个分组级别元素的数组,其中元素的父级就是这个键

Аny解决方案


我尝试调用循环输入dict as tree的递归函数,但我得到的结果是只将一个分支分组,并且只将一个分支分组到下一个分支,等等。我的同事帮助我找到解决方案

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

请解释所需输出的基本概念,这样我们就不必花太多时间去弄清楚了。@RoryDaulton好的,我编辑了我的问题