【问题标题】:Function that takes string as Input, evaluate it like a calculator and return the Integer answer将字符串作为输入的函数,像计算器一样计算它并返回整数答案
【发布时间】:2017-11-15 01:00:39
【问题描述】:

我正在尝试实现一个函数,该函数接受“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”的情况。

【问题讨论】:

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


    【解决方案1】:

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

    .a.b
    

    其中.+-

    您要做的是遍历string 中的每个character,如果characterplusminus(即不是digit),那么将乘法变量更改为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 之间交替时有效。

    【讨论】:

    • @Rajan 请接受!这就是网站的运作方式:)
    • 我是新来的。请指导我如何接受答案?
    • @Rajan 我的答案左边有一个灰色的小勾,当你按下它时它会变成绿色,表示这个答案解决了你的问题
    • @Rajan 谢谢!
    【解决方案2】:

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

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

    【讨论】:

    • 试过了。获取 TypeError:'int' 对象不可调用
    【解决方案3】:

    由于您只满足加法和减法的需求,因此以下解决方案应该适用于上述任何示例:

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

    【讨论】:

    • 感谢@ThePretendProgrammer
    【解决方案4】:

    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
    

    【讨论】:

    • OP 想要一种自定义方式来计算结果,而不是使用任何现有的 Python 函数
    • @ThePretendProgrammer 这不是使用 python 代码的正确方法。这是python中最糟糕的编码方式。我们应该简化代码,不要让它变得复杂。
    • 我并不是在赞扬 OP 的编码风格,只是指出他要求手写计算逻辑。我们可以在自己编写计算逻辑的同时简化代码:)。
    • 感谢您的快速回复。但是,我需要它而不使用现有的 Python 函数
    • 谢谢@AnjaneyuluBatta
    猜你喜欢
    • 2013-03-24
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    相关资源
    最近更新 更多