列表理解与lambda+过滤器

列表理解与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)?


慕勒3428872
浏览 511回答 3
3回答

阿波罗的战车

奇怪的是,不同的人有多大的美。我觉得清单上的理解比filter+lambda但只要你觉得更容易就用吧。但是,不要再给出已经用于内置的变量名了,这是令人困惑的。[最初使用的问题list作为变量名,但根据此答案进行了更新。]有两件事可能会减慢您对filter.第一个是函数调用开销:一旦您使用Python函数(不管是由def或lambda)过滤器可能会比列表理解慢。几乎可以肯定,这还不够重要,在您对代码进行计时并发现它是一个瓶颈之前,您不应该过多地考虑性能问题,但差别就在这里。可能出现的另一个开销是lambda被迫访问一个作用域变量(value)。这比访问局部变量要慢,在Python2.x中,列表理解只访问局部变量。如果您使用Python3.x,列表理解将在一个单独的函数中运行,因此它也将访问value通过一个闭包,这个差别就不适用了。要考虑的另一种选择是使用生成器而不是列表理解:def filterbyvalue(seq, value):    for el in seq:        if el.attribute==value: yield el然后,在您的主要代码中(这是可读性真正重要的地方),您已经用一个有希望有意义的函数名替换了列表理解和筛选。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python