也许这是一个简单的问题,但我是Python的新手,还没有见过其他人发布类似的内容。
我们有一个列表:
lst1 = ["5", "+", "1"]
或
lst2 = ["10", "/", "2"]
如何将其解释为:5+1或10/2?我知道你可以写:int(lst2[0](,然后你会得到10,但你如何用"+"或"/"做同样的事情?
假设您"知道"您的列表有三个字符串,第一个和最后一个表示整数,中间一个表示一组固定运算符中的一个,您只需要从运算符到实现它的函数的映射。例如:
import operator
ops = {"+": operator.add, "-": operator.sub, "*": operator.mul, "/": operator.div}
lst1 = ["5", "+", "1"]
f = ops[lst1[1]]
operand1 = int(lst1[0])
operand2 = int(lst1[2])
result = f(operand1, operand2)
然而,一旦您开始允许更通用的输入,事情就会变得复杂,因为您需要一些逻辑来决定列表的哪些部分代表什么。为此,您需要:
- 一个语法,它确定了列表中的每个元素所扮演的角色
- 解析器,它使用语法将每个字符串转换为一个常用值
- 解释器,它评估解析器生成的东西以生成最终值
也可能有一个令牌化器,它将把像"5 + 1"
这样的单个字符串输入转换为解析器用于其输入的令牌列表。
关于如何定义上面定义的4个概念中的任何一个的任何进一步的一般性讨论都远远超出了Stack Overflow的范围。
如果我理解得对,这里有一个片段可以从开始
import operator
operators = {'+': operator.add, '-': operator.sub, '/': operator.truediv, '*': operator.mul}
first, op, second = lst
first, op, second = int(first), operators[op], int(second)
op(first, second)
operator
模块包含运算符作为函数,因此您可以将符号映射到运算符。请注意,我已经将truediv
用于/
,您可能希望使用始终返回int的变量
不能将字符串"+"
转换为运算符+
,因为运算符不是运行时存在的东西。运算符只存在于代码中。不过,可以将字符串"+"
映射到一个接受两个参数并返回其和的函数。大多数操作员的功能等价物存在于operator
模块中:
lst1 = ["5", "+", "1"]
import operator
op_table = {
'+': operator.add,
'-': operator.sub,
'*': operator.mul,
'/': operator.truediv
}
lhs = int(lst1[0])
op = op_table[lst1[1]]
rhs = int(lst1[2])
print('result:', op(lhs, rhs)) # output: 6
您可以使用标准函数eval((https://www.journaldev.com/22504/python-eval-function
lst1 = ["5", "+", "1"]
result1 = eval("".join(lst1)) # 6
lst2 = ["10", "/", "2"]
result2 = eval("".join(lst2)) # 5.0