假设你有一份人员名单。
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”的人?
答案 0 :(得分:4)
只需一个列表而没有其他索引,您必须使用列表解析:
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))。
答案 1 :(得分: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"]
它将返回空列表以表示不匹配,如果只有一个人具有该名称,则返回包含一个元素的列表;如果有多个Bobs,则返回包含多个元素的列表。
答案 2 :(得分:0)
你可以做到的一种方法是建立一个类来保存人物对象的集合。执行此操作的最佳方法之一可能类似于以下代码:
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__
方法中有太多的下划线。希望这会有所帮助。