0

假设你有一份人员名单。

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”的人?

4

3 回答 3

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))。

于 2012-09-08T20:12:01.520 回答
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,则返回一个包含多个元素的列表。

于 2012-09-08T20:13:00.480 回答
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__方法中有太多下划线。希望这可以帮助。

于 2012-09-08T20:29:18.617 回答