将字符串作为输入的函数,将其评估为计算器并返回整数答案

时间:2017-11-14 16:09:58

标签: python python-3.x python-2.7

我正在尝试实现一个接受字符串输入的函数,例如“1 + 2-3”或“-2 + 2”,将其评估为计算器并返回整数答案。

在示例中,两个输入都将返回0。我们可以假设只有+或 - 运算符(没有多个/除​​法/或任何其他运算符),并且输入格式正确,因此我们不需要进行任何验证(即它总是交替运算符/操作数)

我需要使用现有的Python函数,比如calc()等。相反,我尝试开发一个实际执行此操作的简单代码。

我的代码是

d =  {}
sum = 0
for index, value in enumerate(s):
   if value.isdigit():
           pass
   else:
           if not value.isdigit():
                   d[index] = int(s[index]+s[index+1])


for i in d.values():
   sum += i

但它仅适用于“-2 + 2”的情况。

我怎么能让这个也适用于“1 + 2-3”的情况。

4 个答案:

答案 0 :(得分:1)

您的代码中有正确的想法,但正在尝试通过引用sum中的下一个character来有效地添加到stringstring将您限制为.a.b 形式:

.

其中+-character

您要做的是遍历string中的每个character,如果plusminusdigit(即不是{ {1}})然后将乘法变量分别更改为1-1。然后,无论何时达到要添加或减去的实际数字,只需将该数字乘以乘法值即可。

所以这是上面概述的逻辑代码:

s = "1+2-3"
m = 1
sm = 0
for c in s:
    is c.isdigit():
        sm += m * int(c)
    else:
         m = -1 if c == "-" else 1

sm输出为:

0

请注意,仅当stringoperationdigit之间切换时才会有效。

答案 1 :(得分:0)

使用正则表达式非常容易。 re.finditer(r'([+-]?\d)', d)将找到所有出现的单个数字,可以选择以符号开头。在+之后添加[+-]?\d,您也可以计算多位数字。

import re

d = '-2+2'    
total = sum(int(i.group()) for i in re.finditer(r'([+-]?\d+)', d))

答案 2 :(得分:0)

由于您只提供加法和减法,因此以下解决方案适用于您上述任何示例:

def calculate(s):
   sWithAdd = s.replace('-', '+-')
   numbers = sWithAdd.split('+')
   return sum([int(i) for i in numbers if i != ''])

t = '1+2-32+64-71'
print(calculate(t)) #Prints -36, the correct answer

以上代码的工作原理如下:

  1. 首先,对于字符串中的所有-(minuses),我们将其替换为+-。我们示例的结果字符串变为1+2+-32+64+-71。我们这样做的原因是将我们的输入转换为一系列数字
  2. 然后,我们将字符串拆分为+,只提供我们想要添加的数字。
  3. 最后,我们使用python中的sum函数对列表中的所有数字求和。如果需要,您可以为此目的使用自定义for循环。

答案 3 :(得分:-1)

pythonic方式是使用eval

eval("-2+2")
eval("1+2-3")

如果您想以自己的方式实施,那么

def f(s):
   s = s.replace('-', ' -')
   s = s.replace('+', ' +')
   l = s.split(" ")
   sum = 0
   for num in l:
       sum = sum + float(num)
   return sum
s = "4747-74+484-44"
print (f(s))
# output: 5113.0