0

このクラスから作成されたオブジェクトの数は任意です。

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))

この種の機能は機能しますが、myList内の各Personに対してどちらか一方を返します-私は1つの戻りだけが必要です...

私はある種のことをする必要があることに気づきます

if val in myList:....

しかし、各オブジェクトを反復処理せずに「val」がどうあるべきかを表現する方法に問題があります

4

2 に答える 2

5

ループを使用することは問題ありません。名前が一致しない場合を処理する必要があります。これは、およびを使用して簡単に行うことができ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))
于 2012-12-20T23:09:24.517 に答える
1

使用できますitertools

try:
    found_person = itertools.dropwhile(lambda person: person.name != search_name, people).next()
except StopIteration:
    found_person = None
于 2012-12-20T23:12:22.840 に答える