我碰巧发现自己有一个基本的过滤需求:我有一个列表,并且必须按项目的属性对其进行过滤。
我的代码如下所示:
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
是过滤器生成器对象而不是列表。
filter
更具可读性。当您有一个简单的表达式可以在listcomp中按原样使用,但必须包装在lambda中(或类似地由partial
或operator
函数构造等)传递给时filter
,这就是listcomps获胜的时候。