Python:过滤列表的更简洁方法

时间:2014-06-05 10:41:52

标签: python filter

我想为列表中与某些属性匹配的每个元素执行一些代码。 所以我的代码看起来像:

for x in filter(f, lx):
    do some stuff

但我的函数f是在对象x中定义的,所以我必须写:

for x in filter(lambda x: x.f(), lx):
    do some stuff

也许我有点挑剔,但是当我已经在其他地方定义了这个函数时,我发现定义一个lambda函数是愚蠢的... 有没有更有效和简洁的方法来做我想要的?

2 个答案:

答案 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

(这比你想象的要长,但是我想到了另一种方式。)