Проверка списка с 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 шт):
Как мне проверить что в списке 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))
Но вообще это довольно простое задание, хотя решать его можно разными способами.
#Данный словарь будет иметь вид:
#{
# имя_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