Подскажите пожалуйста, что нужно исправить, чтобы 2я функция работала. Выдает ошибку: TypeError: 'float' object is not iterable
Задачи Вам необходимо выполнить следующие задачи:
Создать функцию calculate_average_age, которая принимает список словарей с информацией об учениках. Внутри функции пройтись по каждому словарю в списке и извлечь значение возраста по ключу age. Вычислить средний возраст учеников. Создать функцию filter_students_by_age, которая принимает два аргумента список словарей с информацией об учениках и возраст для фильтрации. Внутри функции пройтись по каждому словарю в списке и проверить, является ли возраст ученика меньше указанного возраста. Собрать все словари учеников, у которых возраст меньше среднего, в отдельный список и вернуть его как результат работы функции. Проверить функции на списке учеников и убедиться, что они правильно вычисляют средний возраст и фильтруют учеников.
if __name__ == '__main__':
# Пример списка учеников
students_list = [
{
"name": "Саша",
"age": 27,
},
{
"name": "Кирилл",
"age": 52,
},
{
"name": "Маша",
"age": 14,
},
{
"name": "Петя",
"age": 36,
},
{
"name": "Оля",
"age": 43,
},
]
# TODO Напишите функцию calculate_average_age
def calculate_average_age(info: dict):
a = [sum(i["age"]/len(i["name"]) for i in info)]
return a[0]
print(calculate_average_age(students_list))
def filter_students_by_age(info: dict, average_age):
b = [k for k in info if sum(k["age"]/len(k["name"]))]
return b
print(filter_students_by_age(students_list, calculate_average_age))
print(f" Средний возраст учеников: {calculate_average_age(students_list)}")
print("Список учеников с возрастом меньше среднего:")
Ответы (1 шт):
1. В вашем примере средний возраст в целом рассчитывается неверно - строка
a = [sum(i["age"]/len(i["name"]) for i in info)]
в контексте данной задачи не имеет смысла. Также вы записываете сумму в список, в котором по итогу будет лишь один элемент, а затем достаете его и возвращаете. Этап с сохранением списка лишний, возвращаем значение суммы сразу, а также меняем алгоритм расчета среднего возраста:
def calculate_average_age(info):
return sum(student["age"] for student in info) / len(info)
2. В реализации фильтрации, где у вас и падает ошибка, мне в целом не понятен ваш подход к решению: мы нигде не сравниваем возраст текущего ученика со средним значением. Вот правильная версия:
def filter_students_by_age(info, average_age):
return [student for student in info if student["age"] < average_age]
А конкретно в вашем примере код не работает из-за того, что вы передаете в функцию sum вместо итерируемого объекта (например, списка) только одно нецелое число - результат выражения k["age"]/len(k["name"]