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++等其他语言中的工作方式,在这里处理函数方法显然不像在我的例子中那样简单。