【问题标题】:finding mean value of a single key in a dictionary python在字典python中查找单个键的平均值
【发布时间】:2020-10-14 03:07:17
【问题描述】:

所以我目前有一个字典列表,我不知道如何找到平均值,但只知道字典中键的总和。我想找到平均值。到目前为止,我写的是总和,而不是平均值。 这是我生成总和的代码:

animal =[ 
{
        'dog' : 50,
        'cat' : 30,
        'bat' : 22,        
    },
    {
        'dog' : 10,
        'fox' : 14
    },
    {
        'bat' : 30,
        'cat' : 50}]
'''''

    acc = {}
    for cur_dict in animal:
        for key,val in cur_dict.items():
            if key in acc:
                acc[key]+=val   
            else:
                acc[key] = val
    print(acc)

''''

【问题讨论】:

  • 你想找什么?平均值还是总和?更清楚
  • 有很多方法可以做。其中之一是维护另一个字典来计算出现次数(而不是值的总和)。与您编写的代码非常相似。然后你需要一个小的处理来划分总和(你已经完成)和每个键的计数
  • 你想要的输出是什么?

标签: python python-3.x list dictionary key


【解决方案1】:

考虑熊猫。

import pandas as pd

animal = [ { 'dog' : 50, 'cat' : 30, 'bat' : 22,}, { 'dog' : 10, 'fox' : 14 }, {'bat' : 30, 'cat' : 50}]

df = pd.DataFrame(animal)
df_mean = df.mean(axis=0)
print(df_mean)

输出:

dog    30.0
cat    40.0
bat    26.0
fox    14.0

【讨论】:

    【解决方案2】:

    您非常接近预期的输出。我想你想要这样的东西。这段代码很明确,说不定能解决你的问题。

    animal =[ 
        {
            'dog' : 50,
            'cat' : 30,
            'bat' : 22,        
        },
        {
            'dog' : 10,
            'fox' : 14
        },
        {
            'bat' : 30,
            'cat' : 50
        }
    ]
    
    acc = {'dog' : 0, 'cat' : 0, 'bat' : 0, 'fox' : 0}
    count = {'dog' : 0, 'cat' : 0, 'bat' : 0, 'fox' : 0}
    for cur_dict in animal:
        for key,val in cur_dict.items():
            if key in acc.keys():
                acc[key] += val
                count[key] += 1
            else:
                acc[key] = val
    print("The sum: " + str(acc))
    for key in acc.keys():
        if key in acc.keys():
            acc[key] = acc[key] / count[key]
    
    print("The mean: " + str(acc))
    

    输出

    The sum: {'dog': 60, 'cat': 80, 'bat': 52, 'fox': 14}
    The mean: {'dog': 30.0, 'cat': 40.0, 'bat': 26.0, 'fox': 14.0}
    

    在高级编程中,可以使用pandas库解决。

    #Importing the library
    import pandas
    
    #Creating the matrix
    mat = pandas.DataFrame(animal)
    
    #Finding the mean
    mean = mat.mean()
    print(mean)
    

    【讨论】:

      【解决方案3】:

      这可能比直接计算慢一点,但我建议您使用两步法:首先,收集值;其次,聚合它们。

      n_by_animals =[{ 'dog' : 50,
                        'cat' : 30,
                        'bat' : 22,
                      }, {
                        'dog' : 10,
                        'fox' : 14
                      }, {
                        'bat' : 30,
                        'cat' : 50
                      }]
      

      你必须先合并字典:

      merged = {}
      for n_by_animal in n_by_animals:
          for a, n in n_by_animal.items():
              merged.setdefault(a, []).append(n)
      

      (有关信息,请参阅setdefault doc。)

      print(merged)
      # {'bat': [22, 30], 'fox': [14], 'dog': [50, 10], 'cat': [30, 50]}
      

      然后计算平均值(或中位数、最大值、最小值、计数、总和......任何你想要的聚合值):

      print({a: sum(ns)/len(ns) for a, ns in merged.items()})
      # {'bat': 26, 'fox': 14, 'dog': 30, 'cat': 40}
      

      【讨论】:

        【解决方案4】:

        这应该可以帮助你:

        lst = [ { 'dog' : 50, 'cat' : 30, 'bat' : 22,
        }, { 'dog' : 10, 'fox' : 14 }, { 'bat' : 30, 'cat' : 50}]
        
        keys_lst = []
        
        for dictionary in lst:
            for key in dictionary.keys():
                if key not in keys_lst:
                    keys_lst.append(key)
        
        elements = 0
        total = 0
        
        mean_lst = []
        
        for key in keys_lst:
            total = 0
            elements = 0
            for dictionary in lst:
                try:
                    total += dictionary[key]
                    elements += 1
                except KeyError:
                    pass
            mean_lst.append(round(total/elements,2))
        
        for x in range(len(keys_lst)):
            print(f"{keys_lst[x]} = {mean_lst[x]}")
        

        输出:

        dog = 30.0
        cat = 40.0
        bat = 26.0
        fox = 14.0
        

        【讨论】:

        • 这个答案不正确(查看其他答案的结果)。您应该在外部循环内重置 elements 和 total 以计算当前键的平均值,而不是所有键的平均值。
        猜你喜欢
        • 1970-01-01
        • 2019-03-14
        • 1970-01-01
        • 2020-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多