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

Python:一种更简洁的列表过滤方法,python,filter,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函数很愚蠢,因为我已经在其他地方定义了这个函数。。。 有没有一种更有效、更简洁的方法来做我想做的事情 直接使用类中定义的f方法: f

我想为列表中与某个属性匹配的每个元素执行一些代码。 因此,我的代码如下所示:

for x in filter(f, lx):
    do some stuff
但是我的函数f是在对象x中定义的,所以我必须写:

for x in filter(lambda x: x.f(), lx):
    do some stuff
也许我有点挑剔,但我发现定义lambda函数很愚蠢,因为我已经在其他地方定义了这个函数。。。
有没有一种更有效、更简洁的方法来做我想做的事情

直接使用类中定义的
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
def filter_f(lx):
    for x in lx:
        if x.f():
            yield x

...

for x in filter_f(lx):
    # do something
假设
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
A类:
定义初始化(self,b):
赛尔夫
def检查(自我):
返回自我。b<10
l=[A(8)、A(40)、A(5)、A(7)、A(33)]
对于内置过滤器(a.检查,l):
打印a.b

直接使用类中定义的
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
def filter_f(lx):
    for x in lx:
        if x.f():
            yield x

...

for x in filter_f(lx):
    # do something
假设
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
A类:
定义初始化(self,b):
赛尔夫
def检查(自我):
返回自我。b<10
l=[A(8)、A(40)、A(5)、A(7)、A(33)]
对于内置过滤器(a.检查,l):
打印a.b
也许要避免过滤器:

for x in lx:
    if x.f():
        # do some stuff
这是更多的行,但更清晰的代码。如果您发现自己经常这样做,请制作一个发电机:

import itertools
for x in itertools.ifilter(X.f, lx):
    # do some stuff
def filter_f(lx):
    for x in lx:
        if x.f():
            yield x

...

for x in filter_f(lx):
    # do something
(这比我想象的要长,但演示了另一种方法。)

也许要避免过滤器:

for x in lx:
    if x.f():
        # do some stuff
这是更多的行,但更清晰的代码。如果您发现自己经常这样做,请制作一个发电机:

import itertools
for x in itertools.ifilter(X.f, lx):
    # do some stuff
def filter_f(lx):
    for x in lx:
        if x.f():
            yield x

...

for x in filter_f(lx):
    # do something

(这比我想象的要长,但演示了另一种方法。)

谢谢,这很有效。你知道它是否和@NedBatchelder的答案一样有效吗?我的意思是它应该是,但是python正在动态地创建一个新列表吗?@user3561471我认为这是一个比NedBatchelder更“python”的方法,但是它的效率更低(python正在动态地创建一个列表)。我已经使用
itertools
模块更新了我的答案,这是(我认为)最好的选择!FWIW,我想很多人会惊讶于这一点。这是一种罕见的技术,我不知道它是否常用,但我不明白为什么不应该。doc()说
X.f
是一个以
X
为第一个参数的函数,并且
X.f()
X.f(X)
完全等价,因此它由
doc
明确定义。IMO,人们害怕使用类方法作为回调函数,因为它在其他语言中如C++这样工作,处理函数方法显然不像我的例子那么简单。你知道它是否和@NedBatchelder的答案一样有效吗?我的意思是它应该是,但是python正在动态地创建一个新列表吗?@user3561471我认为这是一个比NedBatchelder更“python”的方法,但是它的效率更低(python正在动态地创建一个列表)。我已经使用
itertools
模块更新了我的答案,这是(我认为)最好的选择!FWIW,我想很多人会惊讶于这一点。这是一种罕见的技术,我不知道它是否常用,但我不明白为什么不应该。doc()说
X.f
是一个以
X
为第一个参数的函数,并且
X.f()
X.f(X)
完全等价,因此它由
doc
明确定义。IMO,人们害怕使用类方法作为回调函数,因为它在C++等其他语言中的工作方式,在这里处理函数方法显然不像在我的例子中那样简单。