Lambda用于不同的列表元素

2024-04-24 23:10:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过使用Replacements for switch statement in Python中的以下示例来实现一个函数:

def f(x):
    return {
        '+': (lambda x: x[1] + x[2]),
        '-': (lambda x: x[1] - x[2])
    }[x[0]]

print(f(["+",2,3])) #Output should be 5. 

f(["-", 4, 1]) # Output should be 3.

我显然做错了什么。也许有人对此有更好的建议?你知道吗

编辑:

如果我想将lambda的输出保存在一个列表中,然后返回它呢?你知道吗

例如:

def f(x, output):
    return {
        '+': (lambda x: x[1] + x[2]),
        '-': (lambda x: x[1] - x[2])
    }[x[0]]

output = [10, 20, 30, 40]

# to 2nd element in output list we add the last element in the list
print(f(["+",2,3], output)) #Output should be output = [10, 20, 33, 40]

output = [10, 20, 30, 40]
f(["-", 1, 100]) # Output should be [10, 120, 30, 40].

Tags: thelambdainforoutputreturndefelement
2条回答

您的字典将字符串映射到函数,而不是该函数的结果,这就是lambda所在的位置。你可以用两种方法来解决这个问题:或者直接计算结果,或者在最后调用函数。你知道吗

def f(x):
    return {
        '+': (lambda: x[1] + x[2]),
        '-': (lambda: x[1] - x[2])
    }[x[0]]()  # calling the function!

print(f(["+",2,3])) #Output should be 5. 

f(["-", 4, 1]) # Output should be 3.

但是,您也可以声明函数,并向其传递参数。这也将使它更加灵活,因为例如一个假设的f(["sin", 1.2])只有一个参数。例如,我们可以构建一个字典,如:

from operator import add, sub
from math import sin

FUNC_DICT = {
    '+': add,
    '-': sub,
    'sin': sin
}

然后我们的f看起来像:

def f(x):
    return FUNC_DICT[x[0]](*x[1:])

所以我们用列表中的其余元素调用函数。你知道吗

请记住将映射函数实际应用于变量:

def f(x):
    return {
        '+': (lambda x: x[1] + x[2]),
        '-': (lambda x: x[1] - x[2])
    }[x[0]](x)

print(f(["+",2,3]))  # 5 

这是一个更灵活的版本:

d = {'+': (lambda x: x[1] + x[2]),
     '-': (lambda x: x[1] - x[2])}

def calculator(x, d):
    return d[x[0]](x)

print(calculator(["+",2,3], d))  # 5

更好的办法是使用调度器只存储操作。你知道吗

详见@WillemVanOnsem's answer。你知道吗

相关问题 更多 >