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
的方法来实现这个目标吗?
答案 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__
方法进行一些检查。