【问题标题】:Sum of digits in a string字符串中的数字总和
【发布时间】:2013-01-11 01:59:41
【问题描述】:

如果我只是在这里阅读了我的 sum_digits 函数,这在我的脑海中是有道理的,但它似乎产生了错误的结果。有什么建议吗?

def is_a_digit(s):
''' (str) -> bool

Precondition: len(s) == 1

Return True iff s is a string containing a single digit character (between
'0' and '9' inclusive).

>>> is_a_digit('7')
True
>>> is_a_digit('b')
False
'''

return '0' <= s and s <= '9'

def sum_digits(digit):
    b = 0
    for a in digit:
        if is_a_digit(a) == True:
            b = int(a)
            b += 1

    return b

对于函数sum_digits,如果我输入sum_digits('hihello153john'),它应该会产生9

【问题讨论】:

  • 你得到什么而不是 9?
  • 它产生 4,因为它需要最后一个数字 3 并加上 1,因为您每次运行循环时都设置 b 的值

标签: python string sum digits


【解决方案1】:
#if string =he15ll15oo10
#sum of number =15+15+10=40

def sum_of_all_Number(s):
    num = 0
    sum = 0

    for i in s:
        if i.isdigit():
            num = num * 10 + int(i)
        else:
            sum = sum + num
            num = 0
    return sum+num

#if string =he15ll15oo10
#sum of digit=1+5+1+5+1+0=13

def sum_of_Digit(s):
    sum = 0

    for i in s:
        if i.isdigit():
             sum= sum + int(i)

    return sum

s = input("Enter any String ")

print("Sum of Number =", sum_of_all_Number(s))
print("Sum Of Digit =", sum_of_Digit(s))

【讨论】:

    【解决方案2】:

    请注意,您可以使用内置函数轻松解决此问题。这是一个更惯用和更有效的解决方案:

    def sum_digits(digit):
        return sum(int(x) for x in digit if x.isdigit())
    
    print(sum_digits('hihello153john'))
    => 9
    

    特别要注意,is_a_digit() 方法已经存在用于字符串类型,它被称为 isdigit()

    sum_digits()函数中的整个循环可以使用生成器表达式作为sum()内置函数的参数更简洁地表达,如上所示。

    【讨论】:

    • @HaseeBMir 当然如果不起作用...在 ideone 中,您需要显式打印结果。我的实现没有任何问题,它可以在任何真正的解释器中工作,你只是忘了添加print()。请删除您的反对票,问题出在 您的 代码上,而不是我的。
    • @HaseeBMir 你不应该在ideone中测试别人的代码,使用真正的解释器,否则你会得到不正确的结果。
    • ideone 是最准确的编码编辑器
    • 你应该为所有编译器和解释器编写完整的代码。
    • @HaseeBMir 为什么不看看这个网站上所有其他数百万个 Python 答案?如果您有空闲时间,您可以开始为所有这些添加print(),因为根据您的说法,它们“都是错误的”并且应该“适用于所有编译器和解释器”并且“ideone 是最准确的编辑器" xD
    【解决方案3】:

    另一种方法:

    def digit_sum(n):
      new_n = str(n)
      sum = 0
      for i in new_n:
        sum += int(i)
      return sum
    

    【讨论】:

      【解决方案4】:

      我想提出一个使用 regx 的不同解决方案,涵盖两种情况:

      1.
      输入 = 'abcd45def05'
      输出 = 45 + 05 = 50

      import re
      print(sum(int(x) for x in re.findall(r'[0-9]+', my_str)))
      

      注意一次或多次出现的“+”

      2.
      输入 = 'abcd45def05'
      输出 = 4 + 5 + 0 + 5 = 14

      import re
      print(sum(int(x) for x in re.findall(r'[0-9]', my_str)))
      

      【讨论】:

        【解决方案5】:

        只是@oscar 答案的一种变体,如果我们需要总和为个位数,

        def sum_digits(digit):
            s = sum(int(x) for x in str(digit) if x.isdigit())
            if len(str(s)) > 1:
                return sum_digits(s)
            else:
                return s
        

        【讨论】:

          【解决方案6】:

          使用内置函数的另一种方法是使用reduce 函数:

          >>> numeric = lambda x: int(x) if x.isdigit() else 0
          >>> reduce(lambda x, y: x + numeric(y), 'hihello153john', 0)
          9
          

          【讨论】:

            【解决方案7】:

            一个班轮

            sum_digits = lambda x: sum(int(y) for y in x if y.isdigit())
            

            【讨论】:

              【解决方案8】:

              您的代码的等效项,使用列表推导:

              def sum_digits(your_string):
                  return sum(int(x) for x in your_string if '0' <= x <= '9')
              

              它会比“for”版本运行得更快,并节省大量代码。

              【讨论】:

                【解决方案9】:

                如果a 是一个数字,您将在每次迭代中重置b 的值。

                也许你想要:

                b += int(a)
                

                代替:

                b = int(a)
                b += 1
                

                【讨论】:

                • 哇,好用!你能解释一下为什么我的没用吗?
                • b = int(a) 行将b 的值设置为数字字符的整数值。然后你添加一个。在您的示例中,最后一位数字是3,因此您将b 设置为3,然后添加1,得到4。相反,您希望将b 增加每个数字的值。
                猜你喜欢
                • 2019-03-29
                • 1970-01-01
                • 2012-08-11
                • 1970-01-01
                • 2023-01-08
                • 2020-01-18
                • 2021-12-08
                • 1970-01-01
                • 2018-06-26
                相关资源
                最近更新 更多