【问题标题】:Compute sum of digits of a given string in python在python中计算给定字符串的数字总和
【发布时间】:2020-04-17 07:11:33
【问题描述】:

我有这个字符串,我想计算总和,但它没有显示正确的答案,它打印 51。

sumAndAverage = "English = 78 Science = 83 Math = 68 History = 65"

def sum_digits_string(str1):
    sum_digit = 0
    for x in str1:
        if x.isdigit():
            z = int(x)
            sum_digit = sum_digit + z

    return sum_digit 

print(sum_digits_string(sumAndAverage))

【问题讨论】:

  • 它计算所有数字的总和(7+8+8+3+6+8+6+5)。你想计算所有数字的总和吗?
  • 好吧,7+8+8+3+6+8+6+5 = 51 :-) 数字之和。你期待什么?
  • 您的程序将单个数字相加而不是“整个”数字
  • 那是因为它读取每个数字并添加它,你有 7+8+8+3+6+8+6+5

标签: python sum digits


【解决方案1】:

使用list comprehensionsum() 的最佳(Pythonic)方法。试试这个:

sumAndAverage = "English = 78 Science = 83 Math = 68 History = 65"

li = [int(x) for x in sumAndAverage if x.isdigit()]
print("List:", li, "=", sum(li))

输出:

List: [7, 8, 8, 3, 6, 8, 6, 5] = 51

如果要计算字符串中数字的总和:

sumAndAverage = "English = 78 Science = 83 Math = 68 History = 65"

li = [int(x) for x in sumAndAverage.split() if x.isdigit()]
print("List:", li, "=", sum(li))

输出:

List: [78, 83, 68, 65] = 294

【讨论】:

  • OP 代码也是如此。显然他们的问题陈述是不正确的
【解决方案2】:

尝试使用re

sumAndAverage = "English = 78 Science = 83 Math = 68 History = 65"
nums = re.findall('\d+', sumAndAverage)
nums = [int(num) for num in nums]
print(sum(nums))
# 294

Regex 将尝试查找字符串中的所有数字,将它们存储到list,然后您只需将它们相加即可。

【讨论】:

    【解决方案3】:

    这里有一个可能的解决方案。现在你得到了 229 (78 + 83 + 65)。

    您的代码的问题是您将字符串中的所有数字相加,但您没有考虑到该数字的长度可能超过一个字符。

    sumAndAverage = "English = 78 Science = 83 Math = 68 History = 65"
    
    def sum_digits_string(str1):
        sum_digit = 0
        num = ""
        for x in str1:
            if x.isdigit():
                num += x
            else:
                if num != "":
                    z = int(num)
                    sum_digit += z
                    num = ""
        return sum_digit 
    
    print(sum_digits_string(sumAndAverage))
    

    【讨论】:

      【解决方案4】:

      这是因为您要分别转换每个数字,所以您正在做的是 7 + 8 + 8 + 3 + 6 + 8 + 6 + 5 确实是 51。您在这里要做的是拆分字符串并投射整个数字,尝试这样的事情:

      sumAndAverage = "English = 78 Science = 83 Math = 68 History = 65"
      
      def sum_digits_string(str1):
          sum_digit = 0
      
          for x in str1.split(" "):
              if x.isdigit():
                  z = int(x)
                  sum_digit = sum_digit + z
      
          return sum_digit 
      
      print(sum_digits_string(sumAndAverage))
      

      这是一个付出 294。

      【讨论】:

        【解决方案5】:
        str = 'English = 78 Science = 83 Math = 68 History = 65'    
        a = sum([int(s) for s in str.split() if s.isdigit()])
        print(a)
        

        【讨论】:

          【解决方案6】:

          您当前的代码是打印单个数字的总和,而不是数字。在您的情况下,您可以使用split() 方法来实现您打算做的事情:

          sumAndAverage = "English = 78 Science = 83 Math = 68 History = 65"
          
          def sum_digits_string(str1):
              sum_digit = 0
          
              for x in str1.split():
                  if x.isdigit():
                      sum_digit += int(x)
          
              return sum_digit
          
          print(sum_digits_string(sumAndAverage))
          

          输出: 294

          【讨论】:

            【解决方案7】:

            你也可以用一行代码来实现

            sumAndAverage = "English = 78 Science = 83 Math = 68 History = 65"
            

            解决方案 1:

            from functools import reduce
            
            >>> reduce(lambda a, x: int(a)+int(x), [int(s) for s in sumAndAverage.split() if s.isdigit()])
            294
            

            解决方案 2:

            >>> sum([int(s) for s in sumAndAverage.split() if s.isdigit()])
            294
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-05-26
              • 2018-03-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多