Как вытащить максимальное значение по ключу в списке словарей?

Есть задача: Дан список словарей persons в формате

persons = [{"name": "Sam",
"age": 10},
{"name": "Jackky",
"age": 41},
{"name": "Mal",
"age": 12},
{"name": "Ray",
"age": 97}]

а) Напечатать имя самого молодого человека. Если возраст совпадает - напечатать все имена. б) Напечатать самое длинное имя. Если длина имени совпадает - напечатать все имена. в) Посчитать среднее количество лет всех людей из списка.

Подскажите, пожалуйста как правильно сделать эту задачу?

Пытался решить задание а следующим способом:

for element in persons:
    age= element.get('age')
    print(max(age))

Но программа выдает ошибку


Ответы (1 шт):

Автор решения: gil9red

Но программа выдает ошибку

Потому что max определяет максимум среди элементов коллекции, например у списков. А у вас в age будет число.


Объясняю алгоритм:

  • Для а) и б) суть похожа: группируем данные по ключу, после анализируем ключи и выводим результат. Тут удобно использовать словарь, где в значении будет список, т.к. возможно несколько результатов. В а) ключом будет возраст, а для б) - длина имён
  • Для в) нужно просто посчитать сумму возрастов и разделить на количество. Для удобства храним их в списке, но можно и в двух переменных: для суммы и для количества

Пример:

from collections import defaultdict

persons = [
    {"name": "Sam", "age": 10},
    {"name": "Jackky", "age": 41},
    {"name": "Mal", "age": 12},
    {"name": "Ray", "age": 97}
]

age_by_names = defaultdict(list)
len_name_by_names = defaultdict(list)
ages = []

for p in persons:
    name = p['name']
    age = p['age']
    age_by_names[age].append(name)
    len_name_by_names[len(name)].append(name)
    ages.append(age)

min_age = min(age_by_names)
print('min_age:', *age_by_names[min_age])

max_len_name = max(len_name_by_names)
print('max_len_name:', *len_name_by_names[max_len_name])

print('average:', sum(ages) // len(ages))
→ Ссылка