Python lambda 优化

1 投票
3 回答
629 浏览
提问于 2025-04-16 07:03

我最近刚开始学习lambda(终于开始了),并且弄明白了一些东西,基本概念我掌握了。

我这里有一个用lambda写的map(),我觉得可以简化得更短,但我不知道怎么做:

map(lambda x: [ x.split()[0], x.split()[2], x.split()[4] ] , y)

我希望能一次性获取分割后的'x'的第0、2和4个元素,但现在我得分割三次才能拿到它们……

3 个回答

1

为了增加一些变化,这里没有使用 itemgetter() 的调用:

    map(lambda x: [x[i] for i in (0,2,4)], (s.split() for s in y))

这里的 (0,2,4) 当然可以用 range(0,5,2) 来替代。
对于这么少的项目,你也可以直接写成: [x[0], x[2], x[4]]

它是怎么工作的:这个 lambda 函数简单地返回它接收到的列表中想要的元素。(s.split() for s in y) 是一个生成器,它会生成列表 y 中每个项目的 split() 版本。所有这些的核心是 map() 的调用,它会把 lambda 函数应用到 y 中每个 split() 的项目上。在 Python 2.x 中,它会创建一个包含每次调用结果的列表。

关于你在评论中提到的后续问题,使用 g = lambda x: [x[i] for i in (0,2,4)](g(s.split()) for s in y) 来替代 map()。这个想法基本上是对的,但第二个表达式只会生成一个生成器对象。你需要把它包裹在类似 [g(s.split()) for s in y] 的结构中才能得到结果。

如果你不想单独定义一个名为 glambda 函数,你可以使用:

    [(lambda x: [x[i] for i in (0,2,4)])(s.split()) for s in y]
4

map(lambda x: x.split()[0:5:2] , y)

意思是:先把 x.split() 的结果拿出来,然后从中选取一个子列表 [0:5],这个子列表里只包含每隔一个的元素。

6

在编程中,有时候我们会遇到一些问题,像是代码运行不正常或者出现错误。这种时候,我们可以去一些技术论坛,比如StackOverflow,去寻找解决方案或者向其他人提问。

在这些论坛上,很多人会分享他们的经验和解决方法。你可以看到其他人遇到的类似问题,以及他们是如何解决的。这就像一个大家一起讨论和解决问题的地方,帮助你更快地找到答案。

如果你在学习编程,遇到困难的时候,不妨去这些论坛看看,可能会有意想不到的收获哦!

lambda x: operator.itemgetter(0, 2, 4)(x.split())

撰写回答