如何通过其属性在Python中选择的对象列表的对象

问题描述:

道歉,如果这个问题已经问,但我不认为我知道正确的术语来搜索通过谷歌合适的解决方案。如何通过其属性在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 

在我的案件数量始终是唯一的

感谢您的帮助

+0

在'self.pList.append(人(个体经营,名称,编号))','self'切不可的一个参数。它在'Person.__ init __()'的定义中没有问题,但它代表了新创建的'Person'实例。你也不会在'a = Example()'中看到它。 – flow 2011-03-03 12:38:43

尝试

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

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

我还没有看到下一个循环,它解决了我的问题,欢呼! – Anake 2011-03-09 16:30:58

您需要的术语是'map'或'dictionnary':这会将您引导至the right page in the python doc

非常简单的例子:

>>> a = {123:'dave', 345:'mike'} 
>>> a[123] 
'dave' 
+0

谢谢,我给出的代码过于简单化,Person类包含7个属性。我非常肯定,这是超出了字典的目的,但不确定地图 – Anake 2011-03-09 16:28:05

丢失的下划线使plist公共财产。我不认为这就是你想要的,因为它没有封装功能,你可以拨打a.plist.append而不是a.addPerson

class Example(): 
    ... 
    def filter(self, criteria): 
     for p in self.plist: 
      if criteria(p): 
       yield p 

    def getByNum(self, num): 
     return self.filter(lambda p: p.num == num) 

dave = next(a.getByNum(123)) 

如果数字是独一无二的,你也可以考虑使用从数映射到名称或负责人,而不是一个列表的字典。但这取决于您的实施。

如果这些NOM的是独特的钥匙,你曾经打算做的一切就是用这种独特的键,你确实应该宁可使用字典访问的人。

但是,如果你想添加更多的属性,如果你希望能够通过任何这些属性来检索一个或一个以上的人,你可能会想要去一个更复杂的解决方案:

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

因此,让我们假设我们有一个麦克和两个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)