Python 如何检查实例对象';列表中的属性等于一个值

Python 如何检查实例对象';列表中的属性等于一个值,python,Python,我从该类创建了任意数量的对象: class Person: def __init__(self, name, email): self.name = name self.email = email 我有这些对象的列表: myList = [] JohnDoe = Person("John Doe", "jdoe@email.com") BobbyMcfry = Person("Bobby Mcfry", "bmcfry@email.com") WardW

我从该类创建了任意数量的对象:

class Person:
    def __init__(self, name, email):
        self.name = name
        self.email = email
我有这些对象的列表:

myList = []
JohnDoe = Person("John Doe", "jdoe@email.com")
BobbyMcfry = Person("Bobby Mcfry", "bmcfry@email.com")
WardWilkens = Person("Ward Wilkens", "wwilkens@email.com")
myList.append(JohnDoe)
myList.append(BobbyMcfry)
myList.append(WardWilkens)
我想检查某人是否存在,如果存在,请返回其属性-如果不存在,请说明:

x = input("Who to check for? ")
for i in myList:
    if i.name == x:
        print("Name: {0}\nEmail: {1}".format(i.name, i.email))
    else:
        print("{0} is not on the manifest.".format(x))
这种工作,但返回一个或另一个为每个人在我的名单-我只想要一个回报

我意识到我需要做点什么

if val in myList:....

但是我很难在不迭代每个对象的情况下说出“val”应该是什么,使用循环是可以的,您只需要处理名称不匹配的情况,您可以使用
break
else
轻松做到这一点:

x = input("Who to check for? ")
for i in myList:
    if i.name == x:
        print("Name: {0}\nEmail: {1}".format(i.name, i.email))
        break
else:
    # this is only run if 'break' was not executed inside of the loop
    print("{0} is not on the manifest.".format(x))
根据列表的用途,最好使用字典将姓名链接到
Person
对象:

myDict = {}
JohnDoe = Person("John Doe", "jdoe@email.com")
BobbyMcfry = Person("Bobby Mcfry", "bmcfry@email.com")
WardWilkens = Person("Ward Wilkens", "wwilkens@email.com")
for person in [JohnDoe, BobbyMcfry, WardWilkens]:
    myDict[person.name] = person

x = input("Who to check for? ")
person = myDict.get(x)
if person:
    print("Name: {0}\nEmail: {1}".format(person.name, person.email))
else:
    print("{0} is not on the manifest.".format(x))

使用循环是可以的,您只需要处理名称不匹配的情况,您可以使用
break
else
轻松完成这一操作:

x = input("Who to check for? ")
for i in myList:
    if i.name == x:
        print("Name: {0}\nEmail: {1}".format(i.name, i.email))
        break
else:
    # this is only run if 'break' was not executed inside of the loop
    print("{0} is not on the manifest.".format(x))
根据列表的用途,最好使用字典将姓名链接到
Person
对象:

myDict = {}
JohnDoe = Person("John Doe", "jdoe@email.com")
BobbyMcfry = Person("Bobby Mcfry", "bmcfry@email.com")
WardWilkens = Person("Ward Wilkens", "wwilkens@email.com")
for person in [JohnDoe, BobbyMcfry, WardWilkens]:
    myDict[person.name] = person

x = input("Who to check for? ")
person = myDict.get(x)
if person:
    print("Name: {0}\nEmail: {1}".format(person.name, person.email))
else:
    print("{0} is not on the manifest.".format(x))

可以使用
itertools

try:
    found_person = itertools.dropwhile(lambda person: person.name != search_name, people).next()
except StopIteration:
    found_person = None

可以使用
itertools

try:
    found_person = itertools.dropwhile(lambda person: person.name != search_name, people).next()
except StopIteration:
    found_person = None

您可以添加一个
break
,使循环贪婪并在第一次匹配时停止。您可以添加一个
break
,使循环贪婪并在第一次匹配时停止。工作非常完美。我不知道else除了链接的“如果”之外还能处理其他任何东西。很高兴知道。如果您要为人员列表创建一个dict访问器,而不是复制姓名,那么要么创建一个函数,使用一个只需硬编码一次的参数化姓名创建并插入dict,或者将集合包装在一个覆盖
\uuuu getitem\uuuu
的对象中,以检索一个名为
且与提供的键匹配的人。也请欣赏字典示例-我之前曾尝试将名称链接到对象,但不知道如何操作。效果很好。我不知道else除了链接的“如果”之外还能处理其他任何东西。很高兴知道。如果您要为人员列表创建一个dict访问器,而不是复制姓名,那么要么创建一个函数,使用一个只需硬编码一次的参数化姓名创建并插入dict,或者将集合包装在一个覆盖
\uuuu getitem\uuuu
的对象中,以检索一个名为
且与提供的键匹配的人。也请欣赏字典示例-我之前尝试将名称链接到对象,但不知道如何进行。