Как рассчитать среднее значение из средних значений в словаре с несколькими значениями в каждом ключе без использования функции sum()?

#python #python-3.x

Вопрос:

Спасибо тому, кто помог мне в предыдущем посте, я могу найти средние значения каждого класса в словаре и распечатать среднее значение средних значений с помощью этого кода:

 def avg(classes):  average = {}  for classnames, grades in classes.items():  average[classnames] = sum(grades) / len(grades)  return average  classes = {"Spanish II": [100, 99, 100, 98], "US History I": [95, 96, 97, 94]} averages = avg(classes) print("Average grades in each class:", averages)  average_of_averages = sum(averages.values())/len(averages) print("Average of average grades:", average_of_averages)  

Я просто хочу знать, есть ли способ рассчитать средние значения (как для средней оценки в каждом классе, так и для среднего значения этих средних, суммированных вместе) без использования встроенной функции sum().

Я думаю, что мне нужен вложенный цикл for: один цикл для среднего значения в каждом классе, а затем другой цикл, чтобы найти среднее значение этих средних, но я не знаю, как это сделать, потому что в каждом ключе есть несколько значений.

Комментарии:

1. Думайте в терминах функций. Вы не можете использовать sum по какой-то причине. Хорошо — напишите функцию, чтобы она делала то, что вам нужно. Как бы def custom_sum(list_of_ints): это выглядело?

2. @j1-lee Я просто тестирую различные способы использования словарей Python, я знаю, что использование sum () — самый простой способ, но я думаю, что это просто помогает мне больше практиковаться в использовании разных способов

Ответ №1:

почему бы не использовать pandas вместо этого гораздо проще и быстрее, чем с помощью циклов. Вот код, который вам нужно будет использовать:

 import pandas as pd  classes = {"Spanish II": [100, 99, 100, 98], "US History I": [95, 96, 97, 94]}  df = pd.DataFrame(classes)  avg = df.mean()  avg_of_avg = avg.mean()  

Ответ №2:

вы можете использовать numpy.mean() и приводить averages.values() к списку

 import numpy as np def avg(classes):  average = {}  for classnames, grades in classes.items():  average[classnames] = np.mean(grades)  return average  classes = {"Spanish II": [100, 99, 100, 98], "US History I": [95, 96, 97, 94]}  averages = avg(classes) print("Average grades in each class:", averages)  average_of_averages = np.mean(list(averages.values())) print("Average of average grades:", average_of_averages)  

Ответ №3:

Да, вы можете просто добавить второй цикл следующим образом:

 def avg(classes):  average = {}  for classnames in classes:  total = 0  for grade in classes[classnames]:  total  = grade   average[classnames] = total / len(classes[classnames])  return average  classes = {"Spanish II": [100, 99, 100, 98], "US History I": [95, 96, 97, 94]} averages = avg(classes) print("Average grades in each class:", averages)  total_averages = 0 for classname in averages:  total_averages  = averages[classname] average_of_averages = total_averages / len(averages)  print("Average of average grades:", average_of_averages)  

Если вы хотите, вы также можете полностью пропустить часть расчета каждого из средних значений по отдельным классам и просто рассчитать все среднее значение сразу следующим образом:

 def avg(classes):  total = 0  total_length = 0  for classnames in classes:  for grade in classes[classnames]:  total  = grade   total_length  = len(classes[classnames])  return total / total_length  classes = {"Spanish II": [100, 99, 100, 98], "US History I": [95, 96, 97, 94]} average_of_averages = avg(classes) print("Average of average grades:", average_of_averages)  

Комментарии:

1. Чтобы получить average_of_averages, есть ли другой способ сделать это без использования sum() в строке?

2. @встряхнул Да! Вы можете использовать аналогичный цикл для вычисления этого, а также я отредактировал свой ответ, чтобы показать это