当前位置: 首页 > 编程笔记 >

Python重构过滤器并映射到列表理解

翟承志
2023-03-14
本文向大家介绍Python重构过滤器并映射到列表理解,包括了Python重构过滤器并映射到列表理解的使用技巧和注意事项,需要的朋友参考一下

示例

的filter或map功能应经常列表理解来代替。Guido Van Rossum在2005年的一封公开信中很好地描述了这一点:

filter(P, S)几乎总是用来更清晰地写成,这具有巨大的优势,即最常见的用法是作为比较的谓词,例如,并且定义一个lambda只是需要读者付出更多的努力(加上lambda的速度比列表理解的速度慢) )。更何况成为。当然,在许多情况下,您可以改为使用生成器表达式。[x for x in S if P(x)]x==42map(F, S)[F(x) for x in S]

以下代码行被视为“非pythonic ”,并且会在许多python linter中引发错误。

filter(lambda x: x % 2 == 0, range(10)) # even numbers < 10
map(lambda x: 2*x, range(10)) # 每个数字乘以2
reduce(lambda x,y: x+y, range(10)) # 列表中所有元素的总和

从前面的引言中学到的知识,我们可以将它们filter和map表达式分解为等效的列表理解;还从每个函数中删除了lambda函数-使代码在过程中更具可读性。

# 过滤:
# P(x)= x%2 == 0
# S =范围(10)
[x for x in range(10) if x % 2 == 0]

# 映射
# F(x)= 2 * x
# S =范围(10)
[2*x for x in range(10)]

处理链接功能时,可读性变得更加明显。出于可读性考虑,一个映射或过滤器函数的结果应作为结果传递给下一个;在简单的情况下,可以用单个列表理解来代替。此外,我们可以轻松地从列表理解中看出我们的流程的结果是什么,在推理链式Map&Filter流程时,认知负载会更多。

# 映射 & Filter
filtered = filter(lambda x: x % 2 == 0, range(10))
results = map(lambda x: 2*x, filtered)

# 清单理解
results = [2*x for x in range(10) if x % 2 == 0]

重构-快速参考

  • 映射

    map(F, S) == [F(x) for x in S]
  • 过滤

    filter(P, S) == [x for x in S if P(x)]

其中F和P是分别转换输入值并返回a的函数bool

 类似资料:
  • 问题内容: 我碰巧发现自己有一个基本的过滤需求:我有一个列表,并且必须按项目的属性对其进行过滤。 我的代码如下所示: 但是后来我想,这样写会更好吗? 它更具可读性,并且如果需要性能,则可以取出以获得某些东西。 问题是:使用第二种方法是否有任何警告?有任何性能差异吗?我是否完全想念,应该以另一种方式来做到这一点(例如,使用而不是)吗? 问题答案: 我发现列表理解比 清晰得多,但请使用任何你更容易理解

  • 我刚开始使用RxJava/RxAndroid,在理解如何正确处理背压方面有一些问题。 我有一个文件扫描器,可以扫描目录并发出文件。应尽快处理这些文件,并且不跳过任何文件。 所以管道看起来像这样:<代码>可观察 不幸的是,我收到了rx。例外情况。缺少背压异常错误。所以我读了关于背压的书,如果我理解正确的话,无损耗选项只是缓冲区和窗口。 我试过了BackPressureBuffer()、buffer(

  • 是否有一种方便的Java8流API方法可以从,如下例所示:

  • 有一张单子 如何过滤列表,通过获得最高的映射组,然后使用Java Stream组合到列表中?结果示例如下: ps:如果在多个地图中有相同的值,请将它们全部保留在列表中。 初始代码:

  • 过滤字段的列表,每一个成员应该是数组或对象 $data = [ ['id'=>1, 'name'=>'a'], ['id'=>2, 'name'=>'b'], ]; // 两个毫无意义的实例化写法 $list = new FilterableList; $list = new FilterableList($data); // 只保留 name 字段 $list = new Fi

  • 假设我有一张房间清单 每个房间都有一份人员名单。 使用java8 streams,我想迭代房间列表,获取所有人员,在每个节点上执行一些方法(doSomething()),并获取所有过滤对象的列表。 这是使用java 8的最佳实践吗?