как из списка словарей по одной паре ключей вывести вторую?
Дан список словарей:
persons = [{"name": "Sam", "age": 10}, {"name": "Jackky", "age": 47}, {"name": "Mal", "age": 12}]
- Напечатать имя самого молодого человека. Если возраст совпадает - напечатать все имена.
list_person = []
list_name = []
max_age = 200
min_len = 0
sum_start = 0
for person in persons:
list_person.append(person["age"])
list_name.append(person["name"])
for element in list_person:
if element < max_age:
max_age = element
Выводит возраст, но как вытащить имя, не использую импорт коллекции?
и в этой же задаче второй вопрос: Напечатать самое длинное имя. Если длина имени совпадает - напечатать все имена.
Я написал код:
for len_ele in list_name:
longest_name = len(len_ele)
if longest_name > min_len:
min_len = longest_name
print(len_ele)
Но опять-таки выводит 2 имени разной длины, а не одно. Как это исправить(не используя import)
Ответы (3 шт):
что мешает сделать в 2 действия - сначала определить самый юный возраст, зачем найти всех субъектов с данным возрастом
persons = [{"name": "Sam", "age": 10}, {"name": "Jackky", "age": 47}, {"name": "Mal", "age": 12}]
# найти самый юный возраст
age_min = persons[0]["age"]
for dictionary in persons:
if dictionary["age"] < age_min:
age_min = dictionary["age"]
# выделить имена соответствующие минимальному возрасту
names_min = []
for dictionary in persons:
if dictionary["age"] == age_min:
names_min.append(dictionary["name"])
print(age_min, names_min)
можно два этапа скрестить в один:
age_min = persons[0]["age"]
names_min = [persons[0]["name"]]
for dictionary in persons:
if dictionary["age"] < age_min:
age_min = dictionary["age"]
names_min = [dictionary["name"]]
elif dictionary["age"] == age_min:
names_min.append(dictionary["name"])
т.е. как только мы находим более юного субъекта, то начинаем формировать список заново
Вы можете сначала сделать список пар (имя, возраст):
names_ages = [(person["name"], person["age"]) for person in persons]
(получая для вашего списка [('Sam', 10), ('Jackky', 47), ('Mal', 12)])
и затем применить ваши алгоритмы.
Или вы можете затем из этого списка сделать упорядоченные списки:
by_ages = sorted(names_ages, key=lambda x: x[1])
[('Sam', 10), ('Mal', 12), ('Jackky', 47)]
и
by_name_length = sorted(names_ages, key=lambda x: len(x[0]), reverse=True)
[('Jackky', 47), ('Sam', 10), ('Mal', 12)]
чтобы из них выбирать первый (или несколько первых) элементов — например так:
__, min_age = by_ages[0]
for name, age in by_ages:
if age == min_age:
print(name)
else:
break
и
first_name, __ = by_name_length[0]
max_length = len(first_name)
for name, __ in by_name_length:
if len(name) == max_length:
print(name)
else:
break
Минимальный возраст и максимальную длину имени можно посчитать:
min_age = float('inf')
max_len = float('-inf')
for person in persons:
if person['age'] < min_age:
min_age = person['age']
if len(person['name']) > max_len
max_len = len(person['name'])
и сохранить в списках, например:
names_min_age = [p['name'] for p in persons if p['age'] == min_age]
names_max_len = [p['name'] for p in persons if len(p['name']) == max_len]
Для
persons = [
{"name": "Sam", "age": 10},
{"name": "Jackky", "age": 47},
{"name": "Polly", "age": 12},
{"name": "Jack", "age": 10},
{"name": "Piter", "age": 13},
{"name": "Pan", "age": 47},
{"name": "Mal", "age": 12},
{"name": "Jackly", "age": 42},
]
Выдаст:
>>> names_min_age
['Sam', 'Jack']
>>> names_max_len
['Jackky', 'Jackly']