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

Автор решения: Dan Sazonov

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"]

→ Ссылка