如何通过python中的属性从对象列表中选择对象

Ana*_*ake 10 python oop

如果已经问过这个问题,我很抱歉,但我认为我不知道通过谷歌搜索合适的解决方案的正确术语.

我想通过它的属性值从对象列表中选择一个对象,例如:

class Example():
    def __init__(self):
        self.pList = []
    def addPerson(self,name,number):
        self.pList.append(Person(self,name,number))

class Person():
    def __init__(self,name,number):
        self.nom = name
        self.num = number


a = Example()
a.addPerson('dave',123)
a.addPerson('mike',345)

a.pList #.... somehow select dave by giving the value 123
Run Code Online (Sandbox Code Playgroud)

在我的情况下,数字将始终是唯一的

谢谢您的帮助

Sve*_*ach 11

尝试

dave = next(person for person in a.pList if person.num == 123)
Run Code Online (Sandbox Code Playgroud)

要么

for person in a.pList:
    if person.num == 123:
        break
else:
    print "Not found."
dave = person
Run Code Online (Sandbox Code Playgroud)


cod*_*aft 6

如果这些名字是唯一的键,并且您要做的就是使用这个唯一的键访问您的人员,那么您确实应该使用字典。

但是,如果您想随着时间的推移添加更多属性,并且希望能够通过任何这些属性检索一个或多个人,您可能需要采用更复杂的解决方案:

class Example():
    def __init__(self):
        self.__pList = []
    def addPerson(self,name,number):
        self.__pList.append(Person(name,number))
    def findPerson(self, **kwargs):
        return next(self.__iterPerson(**kwargs))
    def allPersons(self, **kwargs):
        return list(self.__iterPerson(**kwargs))
    def __iterPerson(self, **kwargs):
        return (person for person in self.__pList if person.match(**kwargs))

class Person():
    def __init__(self,name,number):
        self.nom = name
        self.num = number
    def __repr__(self):
        return "Person('%s', %d)" % (self.nom, self.num) 
    def match(self, **kwargs):
        return all(getattr(self, key) == val for (key, val) in kwargs.items())
Run Code Online (Sandbox Code Playgroud)

假设我们有一个迈克和两个戴夫

a = Example()
a.addPerson('dave',123)
a.addPerson('mike',345)
a.addPerson('dave',678)
Run Code Online (Sandbox Code Playgroud)

现在您可以按号码查找人员:

>>> a.findPerson(num=345)
Person('mike', 345)
Run Code Online (Sandbox Code Playgroud)

或者按名称:

>>> a.allPersons(nom='dave')
[Person('dave', 123), Person('dave', 678)]
Run Code Online (Sandbox Code Playgroud)

或两者:

>>> a.findPerson(nom='dave', num=123)
Person('dave', 123)
Run Code Online (Sandbox Code Playgroud)