ここで_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
_が生成されます。
組み込み関数を使用すると、この問題を簡単に解決できることに注意してください。これは、より慣用的で効率的なソリューションです。
_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()
組み込み関数のパラメーターとして使用してより簡潔に表現できます。
b
が数字の場合、反復ごとにa
の値をリセットします。
おそらくあなたが望む:
b += int(a)
の代わりに:
b = int(a)
b += 1
組み込み関数を使用する別の方法は、 reduce 関数を使用することです。
>>> numeric = lambda x: int(x) if x.isdigit() else 0
>>> reduce(lambda x, y: x + numeric(y), 'hihello153john', 0)
9
一発ギャグ
sum_digits = lambda x: sum(int(y) for y in x if y.isdigit())
2つのシナリオをカバーするregxを使用した別のソリューションを提案したいと思います。
1.1。
入力= 'abcd45def05'
出力= 45 + 05 = 50
import re
print(sum(int(x) for x in re.findall(r'[0-9]+', my_str)))
1つ以上のオカレンスの「+」に注意してください
2.2。
入力= 'abcd45def05'
出力= 4 + 5 + 0 + 5 = 14
import re
print(sum(int(x) for x in re.findall(r'[0-9]', my_str)))
それを行う別の方法:
def digit_sum(n):
new_n = str(n)
sum = 0
for i in new_n:
sum += int(i)
return sum
リスト内包表記を使用した、コードに相当するもの:
def sum_digits(your_string):
return sum(int(x) for x in your_string if '0' <= x <= '9')
「for」バージョンよりも高速に実行され、多くのコードを節約します。
合計を1桁にする必要がある場合は、@ 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