我正在尝试实现一个接受字符串输入的函数,例如“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”的情况。
答案 0 :(得分:1)
您的代码中有正确的想法,但正在尝试通过引用sum
中的下一个character
来有效地添加到string
,string
将您限制为.a.b
形式:
.
其中+
是-
或character
。
您要做的是遍历string
中的每个character
,如果plus
是minus
或digit
(即不是{ {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
请注意,仅当string
在operation
和digit
之间切换时才会有效。
答案 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
以上代码的工作原理如下:
-
(minuses),我们将其替换为+-
。我们示例的结果字符串变为1+2+-32+64+-71
。我们这样做的原因是将我们的输入转换为一系列数字+
,只提供我们想要添加的数字。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