2011-03-03 94 views
8

道歉,如果這個問題已經問,但我不認爲我知道正確的術語來搜索通過谷歌合適的解決方案。如何通過其屬性在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

回答

10

嘗試

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

3

您需要的術語是'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

0

丟失的下劃線使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)) 

如果數字是獨一無二的,你也可以考慮使用從數映射到名稱或負責人,而不是一個列表的字典。但這取決於您的實施。

2

如果這些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) 
相關問題