Python lambda优化

Python lambda优化,python,lambda,Python,Lambda,我刚刚学习了lambda(关于时间),我已经弄明白了一些事情,我明白了大概的意思 我这里有一个带有lambda的map(),当然可以缩短,但我不知道如何: map(lambda x: [ x.split()[0], x.split()[2], x.split()[4] ] , y) 我希望可以同时获得拆分“x”的0、2和4个元素,但目前我必须将其拆分3次才能获得它们…map(lambda x:x.split()[0:5:2],y) 意思-获取x.split()并获取子列表[0:5],其中包含每

我刚刚学习了lambda(关于时间),我已经弄明白了一些事情,我明白了大概的意思

我这里有一个带有lambda的map(),当然可以缩短,但我不知道如何:

map(lambda x: [ x.split()[0], x.split()[2], x.split()[4] ] , y)
我希望可以同时获得拆分“x”的0、2和4个元素,但目前我必须将其拆分3次才能获得它们…

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

意思-获取
x.split()
并获取子列表
[0:5]
,其中包含每秒钟的项目。

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

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

意思-取
x.split()
并取子列表
[0:5]
,每个子列表中都有第二项。

只是为了多样性,没有
itemgetter()
调用:

lambda x: operator.itemgetter(0, 2, 4)(x.split())
    map(lambda x: [x[i] for i in (0,2,4)], (s.split() for s in y))
当然,
(0,2,4)
可以替换为
范围(0,5,2)

对于如此少量的项目,您可以直接使用:
[x[0],x[2],x[4]]

工作原理:
lambda
函数只返回所传递列表中所需元素的列表。
(s.split()表示y中的s)
是一个生成器,用于生成列表
y
中项目的
split()
版本。驱动这一切的是对
map()
的调用,它将
lambda
函数应用于
split()
中的每个
y
项。在Python2.x中,它创建了每个调用的结果列表

回答关于使用
g=lambda x:[x[i]表示(0,2,4)中的i)]的评论中的后续问题。
(g(s.split())一起用于y中的s)
以摆脱
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]

为了多样性,无需调用
itemgetter()
call:

    map(lambda x: [x[i] for i in (0,2,4)], (s.split() for s in y))
当然,
(0,2,4)
可以替换为
范围(0,5,2)

对于如此少量的项目,您可以直接使用:
[x[0],x[2],x[4]]

工作原理:
lambda
函数只返回所传递列表中所需元素的列表。
(s.split()表示y中的s)
是一个生成器,用于生成列表
y
中项目的
split()
版本。驱动这一切的是对
map()
的调用,它将
lambda
函数应用于
split()
中的每个
y
项。在Python2.x中,它创建了每个调用的结果列表

回答关于使用
g=lambda x:[x[i]表示(0,2,4)中的i)]的评论中的后续问题。
(g(s.split())一起用于y中的s)
以摆脱
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]


[0:4:2]
只给出前两个。试试
[0:5:2]
[0:4:2]
只给出前两个。试试
[0:5:2]
我想应该是
操作符。itemgetter
?@delnan:Pfft。对这就是我不清醒时发生的事情。我两者都喜欢,但这一个可以让我更好地控制我想要哪一个,是否有一个非-itemgetter()单独使用列表语法的方法?否。
list
不支持任意索引序列。
list
不支持任意索引序列。我假设这应该是
操作符。itemgetter
?@delnan:Pfft。对这就是我不清醒时发生的事情。我两者都喜欢,但这一个可以让我更好地控制我想要哪一个,是否有一个非-itemgetter()单独使用列表语法的方法?否。
list
不支持任意的索引序列。
list
不支持任意的索引序列。请注意,您几乎从未真正想要使用
map
;它几乎完全被列表理解所淘汰。如果你正在阅读一篇指导你使用它的教程,它可能已经很旧了,可能会教你一些坏习惯。写这篇文章(从@Yuval的答案开始)的干净方法是
[x.split()[0:5:2]for x in y]
。是的,但这只是我为了学习而修改lambda。请注意,你几乎从未真正想要使用
map
;它几乎完全被列表理解所淘汰。如果你正在阅读一篇指导你使用它的教程,它可能已经很旧了,可能会教你一些坏习惯。写这篇文章(从@Yuval的答案开始)的干净方法是
[x.split()[0:5:2]for x in y]
。是的,但这只是我为了学习而对lambda进行修补。这就是我想要的,但我看不到它是如何工作的:/而且,这难道不是意味着map()只迭代了一次,for循环就起作用了吗?我们就不能这样摆脱map()吗?你说过你想使用一个
lambda
函数,所以必须调用它,
map
是一个明显的选择。如果你不想使用
lambda
,正如@Glenn Maynard所说,列表理解是一种方法。比如:lambda x:[x[i]代表(0,2,4)](s.split()代表s in y)不,该表达式的结果只是一个
lambda
函数:比如
。还需要调用函数多次并收集结果。这就是为什么要使用
map()
。好的,我明白了。。。有没有可能说:g=lambda x:[x[i]代表(0,2,4)中的i]后来:(g(s.split())代表y中的s)这就是我想要的,但我没有看到jus