字符串中的数字总和

时间:2013-01-27 17:27:14

标签: python string sum digits

如果我刚刚在这里阅读了我的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

8 个答案:

答案 0 :(得分:18)

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

def sum_digits(digit):
    return sum(int(x) for x in digit if x.isdigit())

sum_digits('hihello153john')
=> 9

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

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

答案 1 :(得分:10)

如果b是数字,则您在每次迭代时重置a的值。

也许你想要:

b += int(a)

而不是:

b = int(a)
b += 1

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

一个班轮

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

答案 4 :(得分:1)

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

1。
输入=&#39; abcd45def05&#39;
输出= 45 + 05 = 50

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

注意&#39; +&#39;一次或多次出现

2。
输入=&#39; abcd45def05&#39;
输出= 4 + 5 + 0 + 5 = 14

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

答案 5 :(得分:1)

另一种方法:

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

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:0)

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

int hashCode = comparer.GetHashCode(key) & 0x7FFFFFFF;