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

新手上路,请多包涵

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

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

 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

在我的例子中,这个数字将永远是唯一的

谢谢您的帮助

原文由 Anake 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 444
2 个回答

一种选择是使用 next() 内置:

 dave = next(person for person in a.pList if person.num == 123)

这将抛出 StopIteration 如果没有找到。您可以使用 next() 的双参数形式为该情况提供默认值:

 dave = next(
    (person for person in a.pList if person.num == 123),
    None,
)

一个稍微更冗长的替代方案是 for 循环:

 for person in a.pList:
    if person.num == 123:
        break
else:
    print "Not found."
    person = None
dave = person

原文由 Sven Marnach 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

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

假设我们有一个 Mike 和两个 Dave

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

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

 >>> a.findPerson(num=345)
Person('mike', 345)

或按名称:

 >>> a.allPersons(nom='dave')
[Person('dave', 123), Person('dave', 678)]

或两者:

 >>> a.findPerson(nom='dave', num=123)
Person('dave', 123)

原文由 codecraft 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题