如何将字符串标识为二进制运算符



也许这是一个简单的问题,但我是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)

然而,一旦您开始允许更通用的输入,事情就会变得复杂,因为您需要一些逻辑来决定列表的哪些部分代表什么。为此,您需要:

  1. 一个语法,它确定了列表中的每个元素所扮演的角色
  2. 解析器,它使用语法将每个字符串转换为一个常用值
  3. 解释器,它评估解析器生成的东西以生成最终值

也可能有一个令牌化器,它将把像"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

最新更新