Python - 测试对象属性是否等于给定值

时间:2012-09-08 20:09:53

标签: python list

假设你有一份人员名单。

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

3 个答案:

答案 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__方法中有太多的下划线。希望这会有所帮助。