为了账号安全,请及时绑定邮箱和手机立即绑定

列表理解与lambda+过滤器

列表理解与lambda+过滤器

慕勒3428872 2019-06-24 14:54:36
列表理解与lambda+过滤器我碰巧发现自己有一个基本的过滤需求:我有一个列表,我必须通过条目的一个属性来过滤它。我的代码看起来如下:my_list = [x for x in my_list if x.attribute == value]但后来我想,这样写不是更好吗?my_list = filter(lambda x: x.attribute == value, my_list)它更具可读性,如果性能需要,可以取出lambda以获得一些信息。问题是:使用第二种方式是否有任何警告?表现有什么不同吗?我是否完全忽略了PythonicWay™,并且应该以另一种方式来实现它(例如使用itemgetter而不是lambda)?
查看完整描述

3 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

奇怪的是,不同的人有多大的美。我觉得清单上的理解比filter+lambda但只要你觉得更容易就用吧。但是,不要再给出已经用于内置的变量名了,这是令人困惑的。[最初使用的问题list作为变量名,但根据此答案进行了更新。]

有两件事可能会减慢您对filter.

第一个是函数调用开销:一旦您使用Python函数(不管是由deflambda)过滤器可能会比列表理解慢。几乎可以肯定,这还不够重要,在您对代码进行计时并发现它是一个瓶颈之前,您不应该过多地考虑性能问题,但差别就在这里。

可能出现的另一个开销是lambda被迫访问一个作用域变量(value)。这比访问局部变量要慢,在Python2.x中,列表理解只访问局部变量。如果您使用Python3.x,列表理解将在一个单独的函数中运行,因此它也将访问value通过一个闭包,这个差别就不适用了。

要考虑的另一种选择是使用生成器而不是列表理解:

def filterbyvalue(seq, value):
   for el in seq:
       if el.attribute==value: yield el

然后,在您的主要代码中(这是可读性真正重要的地方),您已经用一个有希望有意义的函数名替换了列表理解和筛选。


查看完整回答
反对 回复 2019-06-24
  • 3 回答
  • 0 关注
  • 510 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信