假设你有一份人员名单。
class Person:
def __init___(self, name, id):
self.name = name
self.id = id
people = []
for x in xrange(0,100)
#find people and append to people list
现在,我有一个人员对象列表。例如,我怎样才能最有效地从人员列表中找到一个名为“Bob”的人?
只有一个列表而没有其他索引,您必须使用列表推导:
matching = [p for p in people if p.name == 'Bob']
但如果你必须做很多,你可能想要创建一个索引:
from collections import defaultdict
nameindex = defaultdict(list)
for person in people:
nameindex[person.name.lower()] = person
nameindex['bob'] # a list of people named Bob.
这样,您只需遍历所有人员一次(成本 O(N)),之后任何名称查找都具有恒定成本(O(1))。
对于这个确切的场景,您需要使用字典:
from collections import defaultdict
people = [...]
name_to_people = defaultdict(list)
for p in people:
name_to_people[p.name].append(p)
然后,每当您想查找所有名为“Bob”的人时:
bobs = name_to_people["Bob"]
如果没有匹配,它将返回一个空列表,如果只有一个具有该名称的人,则返回一个包含一个元素的列表,如果有多个 Bob,则返回一个包含多个元素的列表。
一种方法是构建一个类来保存人员对象的集合。执行此操作的最佳方法之一可能类似于以下代码:
class People:
def __init__(self):
self.members = {}
def add_person(self, person):
self.members[person.name] = person
def __getitem__(self, name):
return self.members[name]
class Person:
def __init__(self, name, id):
self.name = name
self.id = id
现在您应该能够像这样填充 People 对象:
# Add people to a People object
people = People()
people.add_person(Person('Bob', 1))
people.add_person(Person('Surly', 2))
# Get a person by their name
people['Bob'] # Returns instance that is People('Bob', 1)
也只是为了让您知道,我认为您的Person
班级__init__
方法中有太多下划线。希望这可以帮助。