Python lambda表达式,使用列表中的字符串作为operan

2024-03-29 05:08:02 发布

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

假设我有一个简单的列表lis = [5, *, 2]

有没有可能沿着以下路线做一些事情:

print(reduce(lambda x,y,z: float(x) y float(z), lis))
10

我想用列表中给出的字符串来确定操作数。你知道吗


Tags: lambda字符串reduce列表float路线事情print
3条回答

首先,不能将*运算符放在列表中,因为它在Python中不是值。相反,您可以使用mul包中的operator函数:

from operator import mul

然后,假设您有以下列表:

lst = [5, mul, 2]

您可以执行以下操作:

a, op, b = lst
print(op(a,b))

应打印:

10

是的。你知道吗

在Python中不能传递运算符reduce(+, [1,2,3])会给您一个SyntaxError。类似地,列表中间的操作符也会。你知道吗

如果希望使用字符串查找运算符,可以使用operator模块构造字典。你知道吗

SYMBOL_TO_OPERATOR = {"*": operator.mul,
                      "+": operator.add, ...}

这些只是普通的方法,尽管你不能像使用符号一样使用“中缀”符号。你知道吗

此外,作为reduce操作,这没有多大意义(这也不是非常惯用的python)。您可以轻松地执行以下操作:

statements = [[1, "*", 5], [2, "+", 9]]
results = [SYMBOL_TO_OPERATOR[symbol](a, b) for a, symbol, b in statements]

如果我有误解,请告诉我,但我相信下面这样的事情可以满足您的要求:

import operator

operators = {
    '*': operator.mul,
    '/': operator.div
}

dynamic_operator = lambda x,y,z: operators[y](x, z)

some_list = [5, '*', 5]
print dynamic_operator(*some_list)

您需要在operators字典上展开,以包含要动态处理的所有操作。有关更多运算符函数,请参见:https://docs.python.org/2/library/operator.html

相关问题 更多 >