我想为列表中与某些属性匹配的每个元素执行一些代码。 所以我的代码看起来像:
for x in filter(f, lx):
do some stuff
但我的函数f是在对象x中定义的,所以我必须写:
for x in filter(lambda x: x.f(), lx):
do some stuff
也许我有点挑剔,但是当我已经在其他地方定义了这个函数时,我发现定义一个lambda函数是愚蠢的... 有没有更有效和简洁的方法来做我想要的?
答案 0 :(得分:3)
直接使用班级中定义的f
方法:
for x in filter(X.f, lx):
# do some stuff
使用itertools
模块避免创建新列表并使用漂亮的python生成器的更有效方法:
import itertools
for x in itertools.ifilter(X.f, lx):
# do some stuff
假设X
是lx中的元素类。
小例子:
class A:
def __init__ (self, b):
self.b
def check (self):
return self.b < 10
l = [A(8), A(40), A(5), A(7), A(33)]
for a in filter(A.check, l):
print a.b
答案 1 :(得分:1)
也许避免过滤:
for x in lx:
if x.f():
# do some stuff
它的线条更多,但代码更清晰。如果你发现自己经常这样做,那就做一个发电机:
def filter_f(lx):
for x in lx:
if x.f():
yield x
...
for x in filter_f(lx):
# do something
(这比你想象的要长,但是我想到了另一种方式。)