如何通过其属性在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
在我的案件数量始终是唯一的
感谢您的帮助
尝试
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
我还没有看到下一个循环,它解决了我的问题,欢呼! – Anake 2011-03-09 16:30:58
您需要的术语是'map'或'dictionnary':这会将您引导至the right page in the python doc。
非常简单的例子:
>>> a = {123:'dave', 345:'mike'}
>>> a[123]
'dave'
谢谢,我给出的代码过于简单化,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)
在'self.pList.append(人(个体经营,名称,编号))','self'切不可的一个参数。它在'Person.__ init __()'的定义中没有问题,但它代表了新创建的'Person'实例。你也不会在'a = Example()'中看到它。 – flow 2011-03-03 12:38:43