9

ここで自分の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

4

9 に答える 9

26

この問題は、組み込み関数を使用して簡単に解決できることに注意してください。これは、より慣用的で効率的なソリューションです。

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()

于 2013-01-27T17:32:16.227 に答える
9

が数字のb場合、各反復での値をリセットしています。a

おそらくあなたが望む:

b += int(a)

それ以外の:

b = int(a)
b += 1
于 2013-01-27T17:32:00.463 に答える
5

組み込み関数を使用する別の方法は、reduce関数を使用することです。

>>> numeric = lambda x: int(x) if x.isdigit() else 0
>>> reduce(lambda x, y: x + numeric(y), 'hihello153john', 0)
9
于 2013-01-27T18:45:31.197 に答える
1

一発ギャグ

sum_digits = lambda x: sum(int(y) for y in x if y.isdigit())
于 2013-01-27T18:25:46.170 に答える
1

2 つのシナリオをカバーする regx を使用した別のソリューションを提案したいと思います。

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

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

1 つ以上のオカレンスの「+」に注意してください

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

import re
print(sum(int(x) for x in re.findall(r'[0-9]', my_str)))
于 2017-10-03T07:23:11.873 に答える
0

リスト内包表記を使用した、コードに相当するもの:

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

「for」バージョンよりも高速に実行され、多くのコードを節約できます。

于 2013-01-27T17:36:59.897 に答える