【问题标题】:Pythonic way of taking mean of values from Dictionary with Keys使用键从字典中取值平均值的 Pythonic 方法
【发布时间】:2023-02-23 02:54:18
【问题描述】:

给定一个 Python 字典,我试图对键值不匹配的系列取平均值。以下是字典的示例,其中有 N 个 winner_num 键,平均值取自“value_held_graph”的每个索引。

nested_dict = {'winner_num_0': {'cash_held': 1800.546655015998,
  'value_held_graph': [655.0,
   657.1859489988019,
   668.1170748266165,
   673.4509510481149,
   ...
   682.6094632572457
   ]},
  'winner_num_1': {'cash_held': 2307.4282142925185,
  'value_held_graph': [655.0,
   643.9625087246983,
   714.9614460254422,
   716.9587778340948,
   ...
   713.7097698975869
  ]},
  'winner_num_N': {'cash_held': 2307.4282142925185,
  'value_held_graph': [655.0, 
   654.5754236503379, 
   659.630701080459, 
   664.9212169741535,  
   ... 
   654.4366560963232
  ]}

期望的结果如下所示:

value_held_graph_mean = [655.0, 651.9079605, 680.903074, 685.1103153, ..., 683.5852964]

【问题讨论】:

  • 您忘记发布解决此问题的尝试。
  • 这应该是一个简单的for 循环。
  • for 循环完全没问题。并非所有东西都需要某种 pythonic one liner。

标签: python dictionary mean


【解决方案1】:

使用 Numpy 它可以被认为是一种更“Pythonic”的方式吗?

import numpy as np
nested_dict = {
    'winner_num_0': {'cash_held': 1800.546655015998, 'value_held_graph': [655.0, 657.1859489988019, 668.1170748266165, 673.4509510481149, 673.4514510481149, 682.6094632572457]},
    'winner_num_1': {'cash_held': 2307.4282142925185, 'value_held_graph': [655.0, 643.9625087246983, 714.9614460254422, 716.9587778340948, 712.9587778340977, 713.709769897586]},
    'winner_num_N': {'cash_held': 2307.4282142925185, 'value_held_graph': [655.0, 654.5754236503379, 659.630701080459, 664.9212169741535, 662.9412169741535, 654.4366560963232]}
}
value_array = np.array([dict['value_held_graph'] for dict in nested_dict.values()])
value_held_graph_mean = np.mean(value_array, axis=0).tolist()
value_held_graph_mean = [round(val, 7) for val in value_held_graph_mean]
print(value_held_graph_mean)

【讨论】:

    【解决方案2】:

    pythonic 方式是使用 dict.items() 方法

    mean_dict = {}
    for key, value in nested_dict.items():
        mean_dict[key] = mean(value["value_held_graph"])
    

    这将生成一个将键映射到它们的平均值的字典

    或者你可以做一个理解

    mean_dict = {key: mean(value["value_held_graph"]) for key, value in nested_dict.items()}
    

    【讨论】:

      【解决方案3】:

      这是一个在列表中输出平均值的脚本。

      def mean(lst):
          return sum(lst) / len(lst)
      
      data = {
              'winner_num_0': {
                  'cash_held': 1800.546655015998,
                  'value_held_graph': [655.0, 657.1859489988019, 668.1170748266165, 673.4509510481149, 682.6094632572457]
              },
              'winner_num_1': {
                  'cash_held': 2307.4282142925185,
                  'value_held_graph': [655.0, 643.9625087246983, 714.9614460254422, 716.9587778340948, 713.7097698975869]
              },
              'winner_num_N': {
                  'cash_held': 2307.4282142925185,
                  'value_held_graph': [655.0, 654.5754236503379, 659.630701080459, 664.9212169741535, 654.4366560963232]
              }
      }
      
      meanvalues = []
      L = len(data['winner_num_0']['value_held_graph'])
      
      for i in range(L):
          lst = [v['value_held_graph'][i] for k, v in data.items()]
          meanvalues.append(mean(lst))
      
      print("Mean values:")
      print(meanvalues)
      

      这是脚本的输出:

      % python meanvalues.py
      Mean values:
      [655.0, 651.907960457946, 680.9030739775059, 685.1103152854544, 683.5852964170518]
      

      所以这是从给定字典中获取平均值的一种方法。

      此方法假定每个 value_held_graph 具有相同的长度。

      我也以这种方式解释了这个问题:

      meanvalues[0] 是所有获胜者的 value_held_graph[0] 的平均值
      meanvalues[1] 是所有获胜者的 value_held_graph[1] 的平均值
      ...
      meanvalues[L-1] 是所有获胜者的 value_held_graph[L-1] 的平均值

      【讨论】:

      • 那不是要求的输出。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多