当前位置: 首页 > 面试题库 >

Python-列表理解与lambda +过滤器

周阳成
2023-03-14
问题内容

我碰巧发现自己有一个基本的过滤需求:我有一个列表,并且必须按项目的属性对其进行过滤。

我的代码如下所示:

my_list = [x for x in my_list if x.attribute == value]

但是后来我想,这样写会更好吗?

my_list = filter(lambda x: x.attribute == value, my_list)

它更具可读性,并且如果需要性能,则可以取出html" target="_blank">lambda以获得某些东西。

问题是:使用第二种方法是否有任何警告?有任何性能差异吗?我是否完全想念Pythonic Way™,应该以另一种方式来做到这一点(例如,使用itemgetter而不是lambda)吗?


问题答案:

我发现列表理解比filter+ 清晰得多lambda,但请使用任何你更容易理解的列表。

有两件事可能会减慢你对的使用filter

第一个是函数调用开销:使用Python函数(无论是由def还是创建的lambda)后,过滤器的运行速度可能会比列表理解速度慢。几乎可以肯定,这还不够重要,并且在对代码进行定时并发现它是瓶颈之前,你不应该对性能进行太多考虑,但是区别就在那里。

可能适用的其他开销是,lambda被强制访问作用域变量(value)。这比访问局部变量要慢,并且在Python 2.x中,列表推导仅访问局部变量。如果你使用的是Python 3.x,则列表推导是在单独的函数中运行的,因此它也将value通过闭包进行访问,并且这种区别将不适用。

要考虑的另一个选项是使用生成器而不是列表推导:

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

然后,在你的主要代码(这才是真正的可读性)中,你已经用有希望的有意义的函数名称替换了列表理解和过滤器。



 类似资料:
  • 问题内容: 我有两个列表,我要过滤两个列表都包含的thoose元素。我想用lambda表达式做到这一点。 用户getName和客户端getUserName都返回String。 这是我的示例代码: 问题答案: 但这效率很低,因为它是O(m * n)。您最好创建一组可接受的名称: 还要注意,它并不严格等同于您拥有的代码(如果已编译),如果有多个用户具有与该客户端相同的名称,则该客户端会将同一客户端两次

  • 问题内容: 一个合理的常见操作是基于另一个过滤。人们很快发现: 对于大输入而言,速度很慢-为O(n * m)。uck 我们如何加快速度?使用a进行过滤查找O(1): 这给出了很好的整体O(n)行为。但是,我经常看到甚至资深的编码人员也落入 The Trap ™: 阿克!这也是O(n * m),因为python 每次都 构建,而不仅仅是一次构建。 我以为故事就此结束了-python无法优化它,只能构

  • 本文向大家介绍Python重构过滤器并映射到列表理解,包括了Python重构过滤器并映射到列表理解的使用技巧和注意事项,需要的朋友参考一下 示例 的filter或map功能应经常列表理解来代替。Guido Van Rossum在2005年的一封公开信中很好地描述了这一点: filter(P, S)几乎总是用来更清晰地写成,这具有巨大的优势,即最常见的用法是作为比较的谓词,例如,并且定义一个lamb

  • 我有一个类似这样的组对象 和如下所示的Item对象

  • 问题内容: 我想做类似的事情: Python的标准库中是否有类似行为? 我知道在这里自己动手很容易,但是我正在寻找一种更标准的方法。 问题答案: 您可以使用filter方法: 或列表理解: 要查找单个元素,可以尝试: 尽管如果没有匹配项将引发异常,因此您可能希望将其包装在try / catch中。方括号()使之成为生成器表达式,而不是列表理解。 就我个人而言,尽管我只是使用常规的过滤器/理解并采用

  • 问题内容: 我有一堂课: 然后,我有了另一个主要功能,其中有一个功能,必须根据年份过滤该项目列表,并获得名称列表作为结果。 您能告诉我如何使用Java 8 Lambda表达式吗? 谢谢 问题答案: 好吧,您没有说明确切的过滤条件,但是假设您希望按给定年份过滤元素: