在特定成员变量设置为值的情况下搜索这些对象的对象列表?

时间:2014-03-12 20:04:25

标签: python

import string
import random

class Foo(object):
    def __init__(self, bar):
        self.bar = bar

foos = []
for i in range(1,101):
    f = foo(random.choice(string.letters))
    foos.append(f)

fs == find_object_in_list_by_attribute(bar='b')

在python中有一个类似find_object_in_list_by_attribute的方法来实现这个目标吗?

2 个答案:

答案 0 :(得分:3)

只需使用列表推导的[, if <filter>]语法为您提供bar == 'b'的抱怨:

fs = [foo for foo in foos if foo.bar == 'b']

旁注:类应以大写字母开头(如ruby,但只是强烈推荐而非强制),范围对象写为for i in range(100):

如果您只想要第一个 foo(可能是也可能不是唯一的foo),您可以这样做:

fs = next(foo for foo in foos if foo.bar == 'b')

如果StopIteration集合中的任何地方找不到'b',这会显着引发foos例外情况,因此您可以next提供&#34;后备&#34 ;避免这种情况的价值:

fs = next((foo for foo in foos if foo.bar == 'b'), None)

答案 1 :(得分:0)

你可以让它覆盖你班级的==运算符(在python中,方法__eq__)。类似的东西:

import string
import random

class foo(object):
    def __init__(self, bar):
        self.bar = bar

    def __eq__(self, letter):
        return self.bar == letter

foos = []
for i in range(1,101):
    f = foo(random.choice(string.letters))
    foos.append(f)

foos.append(foo("z")) # I'm appending this one to be sure that there is a foo with letter z in the list, this is just for testing purpose

print foos[foos.index("z")].bar

请确保您不需要与foo对象进行比较,只需foo与字母进行比较。如果这样做,您应该使用__eq__方法进行一些检查。