【发布时间】:2011-03-02 02:29:58
【问题描述】:
我碰巧发现自己有一个基本的过滤需求:我有一个列表,我必须按项目的属性对其进行过滤。
我的代码如下所示:
my_list = [x for x in my_list if x.attribute == value]
但后来我想,这样写不是更好吗?
my_list = filter(lambda x: x.attribute == value, my_list)
它更具可读性,如果需要性能,可以取出 lambda 以获得一些东西。
问题是:使用第二种方式有什么注意事项吗?有什么性能差异吗?我是否完全错过了 Pythonic Way™,应该以另一种方式来实现(例如使用 itemgetter 而不是 lambda)?
【问题讨论】:
-
一个更好的例子是你已经有一个很好命名的函数用作你的谓词。在这种情况下,我想更多的人会同意
filter更具可读性。当您有一个可以在 listcomp 中按原样使用的简单表达式,但必须包装在 lambda 中(或类似地由partial或operator函数等构造)以传递给filter,那是 listcomps 获胜的时候。 -
应该说至少在Python3中,
filter的返回是一个过滤器生成器对象而不是一个列表。 -
更具可读性?我想这是个人喜好问题,但对我来说,列表理解解决方案看起来像简单的英语:“对于 my_list 中的每个元素,只有当它的属性等于值时才使用它”(!?)。我想即使是非程序员也可能或多或少地尝试了解发生了什么。在第二个解决方案中......好吧......那个奇怪的“lamba”词是什么?同样,这可能是个人喜好问题,但我会一直选择列表理解解决方案,不管性能上的潜在微小差异,基本上只有研究人员感兴趣。
标签: python list functional-programming filter lambda