字符串中数字的和

12

如果我只是在这里阅读我的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? - CharlesB
1
它输出4,因为它取最后一个数字3并将其加1,由于您在每次运行循环时都将b的值重置。 - Thai Tran
10个回答

29

请注意,您可以使用内置函数轻松解决此问题。这是一个更通俗易懂且高效的解决方案:

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

print(sum_digits('hihello153john'))
=> 9

特别注意,字符串类型已经存在名为isdigit()的方法,用于判断是否为数字。

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


@HaseeBMir 当然,如果在ideone中不起作用...你需要显式地打印结果。我的实现没有问题,在任何真正的解释器中都会工作,你只是忘记添加一个 print()。请撤销您的负评,问题出在_您的_代码上,而不是我的代码。 - Óscar López
@HaseeBMir,你不应该在ideone上测试别人的代码,应该使用真正的解释器,否则你会得到错误的结果。 - Óscar López
ideone是目前最准确的编码编辑器。 - Haseeb Mir
你应该为所有编译器和解释器编写完整的代码。 - Haseeb Mir
@HaseeBMir,为什么不看看这个网站上其他数百万个Python答案呢?如果你手头有空闲时间,你可以在所有答案中添加print(),因为根据你的说法,它们“全部都是错误的”,但应该“在所有编译器和解释器上运行”,而“ideone是最准确的编辑器”xD。 - Óscar López
好的,没问题,我已经取消了踩票,现在我使用主要的编译语言而不是解释性语言,所以我认为对于Python语言来说这很好。干杯! - Haseeb Mir

9

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

也许你想要这样:

b += int(a)

改为:

b = int(a)
b += 1

哇,那个可行!不过你能解释一下为什么我的没成功吗? - user1864828
2
代码相关内容翻译:b = int(a) 这一行将 b 的值设置为数字字符的整数值。然后你再加上 1。在你的例子中,最后一个数字是 3,所以你将 b 设置为 3,然后加上 1,得到 4。相反,你想要按每个数字的值递增 b - Alex Reynolds

5

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

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

1
另一种方法是:

这样做:

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

1
我想提出一种使用正则表达式的不同解决方案,涵盖了两种情况:
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)))

1
一行代码。
sum_digits = lambda x: sum(int(y) for y in x if y.isdigit())

0

这是与@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

0
#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))

0

使用列表推导式重写您的代码:

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

它比“for”循环版本运行更快,并且节省了大量的代码。

0

简单地将输入转换为整数,通过 int(a) 实现 ---> 使用 a.isdigit 确保输入不是 None (''), 如果输入为 None,则将其转换为 0 并简单地返回输入的总和字符串

def sum_str(a, b):
    a = int(a) if a.isdigit() else 0
    b = int(b) if b.isdigit() else 0
    return f'{a+b}'

你的回答可以通过添加更多关于代码的信息以及它如何帮助提问者来改进。 - Tyler2P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接