【问题标题】:Python 3.4 - How to get the average of dictionary values? [closed]Python 3.4 - 如何获得字典值的平均值? [关闭]
【发布时间】:2015-06-06 20:25:36
【问题描述】:

我有以下字典:

StudentGrades = {
    'Ivan': [4.32, 3, 2],
    'Martin': [3.45, 5, 6],
    'Stoyan': [2, 5.67, 4],
    'Vladimir': [5.63, 4.67, 6]
}

我想制作一个打印学生成绩平均值的函数,即值的平均值,但我不知道如何。你能帮帮我吗?

【问题讨论】:

  • 访问每个键的值,求和,除以项目数,然后打印结果。
  • 你知道如何遍历字典中匹配的键和值吗?你知道如何取一个列表的平均值吗?你知道怎么打印东西吗?这些问题中的每一个都已在 SO 上被多次询问和回答。通过将它们结合起来,您可以做您需要做的事情——如果您仍然遇到问题,您的问题会变得非常具体和具体。
  • 您到底需要什么?字典的平均值或字典的平均值或键中每个值元素的平均值???

标签: python python-3.x dictionary average


【解决方案1】:

此答案适用于 Python2,即now dead

好的,让我们遍历所有字典键并对项目进行平均:

avgDict = {}
for k,v in StudentGrades.iteritems():
    # v is the list of grades for student k
    avgDict[k] = sum(v)/ float(len(v))

在Python3中,iteritems()方法不再需要,可以直接使用items()

现在你可以看到:

avgDict
Out[5]: 
{'Ivan': 3.106666666666667,
 'Martin': 4.816666666666666,
 'Stoyan': 3.89,
 'Vladimir': 5.433333333333334}

从您的问题来看,我认为您对 dicts 的迭代感到不安,所以这里的输出与列表相同:

avgList = []
for k,v in StudentGrades.iteritems():
    # v is the list of grades for student k
    avgDict.append(sum(v)/ float(len(v)))

但要小心:字典中的项目顺序是不保证;也就是说,不能保证在字典上打印或迭代时键/值的顺序(因为字典是“未排序的”)。 循环遍历相同的字典对象(没有添加/删除)两次保证行为相同。

【讨论】:

    【解决方案2】:

    如果您不想进行简单的计算,请使用 statistics.mean:

    from statistics import mean
    
    StudentGrades = {
        'Ivan': [4.32, 3, 2],
        'Martin': [3.45, 5, 6],
        'Stoyan': [2, 5.67, 4],
        'Vladimir': [5.63, 4.67, 6]
    }
    
    for st,vals in StudentGrades.items():
        print("Average for {} is {}".format(st,mean(vals)))
    

    【讨论】:

      【解决方案3】:
      from scipy import mean
      map(lambda x: mean(StudentGrades[x]), StudentGrades)
      

      生成此输出:

      [3.1066666666666669,
       3.8900000000000001,
       5.4333333333333336,
       4.8166666666666664]
      

      如果您更喜欢非 scipy 解决方案,可以使用 sumlen,就像 Jiby 所说的那样:

      map(lambda x: sum(StudentGrades[x])/len(StudentGrades[x]), StudentGrades)
      

      编辑:非常抱歉,我忘记了你想要 Python 3.4 解决方案,因此(因为你会得到一个地图对象返回)你需要一个额外的列表命令:

      from scipy import mean
      list(map(lambda x: mean(StudentGrades[x]), StudentGrades))
      

      这将返回所需的输出。

      【讨论】:

      • 不错的 oneliner,但为简单的 dict 加载 scipy ? ^^
      • 是的,如果你真的只需要这种方法,加载整个 scipy 可能不是那么好......但正如我的编辑所示,你可以加载只是意味着......我不认为这会是个问题。
      • 真^^。另外:元素的顺序取决于字典的迭代方式(取决于实现)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多