【问题标题】:Finding the average of specific values in a dictionary查找字典中特定值的平均值
【发布时间】:2016-04-24 09:13:47
【问题描述】:

我有一本像这样的字典。 . .

students_marks = {"barry": [20,25,30], "fred": [12,14,16], "sarah": [32,30,28]

等等,我可以向字典中添加更多带有值的键。 这些值是每个作业的标记

我正在尝试获取第一个作业中所有学生的平均值 例如。巴里 - 20 岁,弗雷德 - 12 岁,莎拉 - 32 岁

这是我目前的代码

students_marks = {"barry": [20,25,30], "fred": [12,14,16], "sarah": [32,30,28]}

def get_below_average_df_report_marks_report():
    sum(float(x[0] for x in students_marks.values())/len(students_marks))

我收到错误:TypeError: float() 参数必须是字符串或数字,而不是“生成器”

【问题讨论】:

    标签: python dictionary average


    【解决方案1】:

    问题是您试图在计算总和之前强制转换为浮点数,它应该是 float(sum... 而不是 sum(float...

    >>> float(sum(x[0] for x in students_marks.values()))/len(students_marks)
    21.333333333333332
    

    就可读性而言,我更喜欢这个解决方案:

    >>> from operator import itemgetter
    >>> first_score = itemgetter(0)
    >>> num_students = float(len(students_marks))
    >>> sum(map(first_score, students_marks.values()))/num_students
    21.333333333333332
    

    如果您更喜欢没有 import 语句的解决方案,那么这个解决方案是等效的:

    >>> first_score = lambda scores: scores[0]
    >>> num_students = float(len(students_marks))
    >>> sum(map(first_score, students_marks.values()))/num_students
    21.333333333333332
    

    请注意,如果您使用的是 Python 3,则不需要强制转换为浮点数,因为默认情况下 / 运算符已经执行浮点除法。

    【讨论】:

      【解决方案2】:

      你的浮动演员已经过时了:

      def get_below_average_df_report_marks_report():
          sum((x[0] for x in students_marks.values())/len(students_marks)
      

      您试图将生成器对象x[0] for x in students_marks.values() 转换为浮点数,这是不可能的,并导致了您的错误。

      请注意,在 Python 3 中,您不必先将值转换为浮点数。除法总是返回一个浮点数。在 python 2 中,您可以使用 from __future__ import division 来强制执行此行为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-02-10
        • 1970-01-01
        • 1970-01-01
        • 2019-03-14
        • 2020-09-21
        • 2020-03-30
        • 1970-01-01
        • 2021-10-12
        相关资源
        最近更新 更多