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

时间:2018-11-01 14:25:03

标签: python

也许这是一个简单的问题,但是我是Python的新手,还没有看到其他人发布过类似的内容。

我们有一个列表:

lst1 = ["5", "+", "1"]

lst2 = ["10", "/", "2"]

如何将其解释为:5 +1或10/2?我知道您可以编写:int(lst2 [0])然后得到10,但是如何用“ +”或“ /”来做同样的事情?

4 个答案:

答案 0 :(得分:3)

如果我理解的正确,那么您可以从以下片段开始:

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的变量

答案 1 :(得分:3)

假设您“知道”列表中有三个字符串,第一个和最后一个代表整数,中间的一个代表一组固定的运算符,那么您只需要从运算符到实现它的函数的映射即可。例如:

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. 一个 parser ,它使用语法将每个字符串转换为可用的值
  3. 解释器,用于评估解析器产生的事物以产生  最终值。

可能还会有一个 tokenizer ,它会将诸如"5 + 1"之类的单个字符串输入转换为解析器用于其输入的令牌列表。

关于如何定义上面定义的4个概念中的任何一个的一般性讨论都超出了Stack Overflow的范围。

答案 2 :(得分:1)

您无法将字符串"+"转换为运算符+,因为运算符不是运行时存在的东西。运算符仅存在于代码中。您可以 将字符串"+"映射到一个带有两个参数并返回其和的函数。 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

答案 3 :(得分:0)

您可以使用标准函数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
相关问题