Проверка списка с namedtuple

from collections import namedtuple

Person = namedtuple('Person', 'name, age')

People = [Person("Michael", 11), Person("Kristina", 11),
          Person("Pavel", 11), Person("Kolya", 11),
          Person("Nastya", 11), Person("Undefined", 12),
          Person("Ghost", 13)]

Как мне проверить что в списке People есть все люди с именем из списка имен ["Michael", "Kristina", "Pavel", "Kolya", "Nastya"] и все они одного возраста, а так же вернуть все их имена с возрастом в в виде "{name} {age}". Возраст не обязательно будет всегда 11 он может быть и другим.


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

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

Как мне проверить что в списке People есть все люди с именем из списка имен ["Michael", "Kristina", "Pavel", "Kolya", "Nastya"] и все они одного возраста,

print(set(names).issubset(set(p.name for p in People)) and len(set(p.age for p in People if p.name in names)) == 1)

А так же вернуть все их имена с возрастом в в виде "{name} {age}".

print(",".join(f"{p.name} {p.age}" for p in People if p.name in names))

Но вообще это довольно простое задание, хотя решать его можно разными способами.

→ Ссылка
Автор решения: MiniMax
#Данный словарь будет иметь вид:
#{
#    имя_1 : возраст,
#    имя_2 : возраст,
#    имя_3 : возраст,
#    ...
#}
d = dict(People)

#По очереди перебираем имена из списка `names` и проверяем, 
#есть ли данное имя в словаре `d` и равен ли возраст этого человека
#возрасту первого человека в списке.
if all(name in d and d[name] == d[names[0]] for name in names):
     #Если проверка пройдена, печатаем.
     #Так как известно, что возраст у всех одинаковый,
     #можно брать возраст любого человека из списка, например первого.
     for name in names:
        print(f"{name} {d[names[0]]}")

Минус этого решения - вариант со словарём возможен только для кортежей с двумя элементами.

Результат

Michael 11
Kristina 11
Pavel 11
Kolya 11
Nastya 11
→ Ссылка