如果已经问过这个问题,我很抱歉,但我认为我不知道通过谷歌搜索合适的解决方案的正确术语.
我想通过它的属性值从对象列表中选择一个对象,例如:
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)
如果这些名字是唯一的键,并且您要做的就是使用这个唯一的键访问您的人员,那么您确实应该使用字典。
但是,如果您想随着时间的推移添加更多属性,并且希望能够通过任何这些属性检索一个或多个人,您可能需要采用更复杂的解决方案:
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)
| 归档时间: |
|
| 查看次数: |
12169 次 |
| 最近记录: |