对列表理解内lambda的热切评估

时间:2019-01-06 23:59:41

标签: python lambda list-comprehension

考虑一个python函数:

def testSetsFromStrings(tt):
  x1= [lambda x: x.split(' ') for x in tt]
  return x1

让我们用以下命令调用它:

tt = ['id0 id1 id2 id3 id4', 
'id10 id11 id12 id13 id14', 
'id20 id21 id22 id23 id24', 
' id30 id31 id32 id33 id34', 
'id50 id51 id52 id53 id54']

testSetFromStrings(tt)

x1= ..行之后放置了一个断点,我们可以看到x1 =

<class 'list'>: [<function testSetsFromStrings.<locals>.<listcomp>.
<lambda> at 0x11cee5730>, <function testSetsFromStrings.<locals>.<listcomp>.
<lambda> at 0x11cee5840>, <function testSetsFromStrings.<locals>.<listcomp>.
<lambda> at 0x11cee58c8>, <function testSetsFromStrings.<locals>.<listcomp>.
<lambda> at 0x11cee5950>, <function testSetsFromStrings.<locals>.<listcomp>.
<lambda> at 0x11cee59d8>]

我不知道如何使lambda受到热切的评估。在这里可以做什么?

**更新**

所示的逻辑是所需的多步函数的简化:仅关注调用lambda的机制。直接调用lambda代替split并不能满足实际需求。

4 个答案:

答案 0 :(得分:2)

也许您根本不需要lambda?这就是你想要的吗?

def testSetsFromStrings(tt):
    x1 = [x.split(' ') for x in tt]
    return x1

Lambda是函数:调用它们时会对其求值。如果希望它们立即运行,则可能根本不需要lambda。

如果您需要调用一个函数,请调用它:

def testSetsFromStrings(tt):
    x1 = [my_function(x) for x in tt]
    return x1

答案 1 :(得分:1)

您正在定义函数,但未对​​其应用任何参数:

试试看

x1 = [(lambda x: x.split(' '))(x) for x in tt]

但是,如果函数非常复杂,最好只是在理解之外提取函数定义,然后使用map或list理解。

答案 2 :(得分:0)

您还可以使用map函数代替列表理解:

x1 = map(lambda x: x.split(' '), tt)

如果您希望使用lamda函数。在其他地方:

x1 = [x.split(' ') for x in tt]

也来自其他人。

答案 3 :(得分:0)

您需要了解的是lambda本身就是函数。因此,创建一个lambda函数并调用它。

testSetsFromStrings = lambda x: x.split(' ')
x1 = [testSetsFromStrings(t) for t in tt]