Python lambda 优化
我最近刚开始学习lambda(终于开始了),并且弄明白了一些东西,基本概念我掌握了。
我这里有一个用lambda写的map(),我觉得可以简化得更短,但我不知道怎么做:
map(lambda x: [ x.split()[0], x.split()[2], x.split()[4] ] , y)
我希望能一次性获取分割后的'x'的第0、2和4个元素,但现在我得分割三次才能拿到它们……
3 个回答
为了增加一些变化,这里没有使用 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]
的结构中才能得到结果。
如果你不想单独定义一个名为 g
的 lambda
函数,你可以使用:
[(lambda x: [x[i] for i in (0,2,4)])(s.split()) for s in y]
map(lambda x: x.split()[0:5:2] , y)
意思是:先把 x.split()
的结果拿出来,然后从中选取一个子列表 [0:5]
,这个子列表里只包含每隔一个的元素。
在编程中,有时候我们会遇到一些问题,像是代码运行不正常或者出现错误。这种时候,我们可以去一些技术论坛,比如StackOverflow,去寻找解决方案或者向其他人提问。
在这些论坛上,很多人会分享他们的经验和解决方法。你可以看到其他人遇到的类似问题,以及他们是如何解决的。这就像一个大家一起讨论和解决问题的地方,帮助你更快地找到答案。
如果你在学习编程,遇到困难的时候,不妨去这些论坛看看,可能会有意想不到的收获哦!
lambda x: operator.itemgetter(0, 2, 4)(x.split())