2016-04-24 1 views
1

У меня есть словарь, который выглядит следующим образом. , ,Поиск среднего значения в словаре

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: поплавок() аргумент должен быть строкой или числом, не «генератор»

ответ

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 

Если вы предпочитаете решение без оператора импорта, это один будет эквивалентно:

>>> 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, приведения в float не нужны, потому что оператор / уже выполняет деление с плавающей запятой по умолчанию.

0

Ваш поплавок литая устарел:

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 вам не нужно сначала преобразовывать значения в поплавок. Отдел всегда возвращает float. В python 2 вы можете использовать from __future__ import division для обеспечения соблюдения этого поведения.