web-dev-qa-db-ja.com

文字列の桁の合計

ここで_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_が生成されます。

7
user1864828

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

_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()組み込み関数のパラメーターとして使用してより簡潔に表現できます。

18
Óscar López

bが数字の場合、反復ごとにaの値をリセットします。

おそらくあなたが望む:

b += int(a)

の代わりに:

b = int(a)
b += 1
10
Alex Reynolds

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

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

一発ギャグ

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

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)))
1
Santosh Pillai

それを行う別の方法:

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

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

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

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

0
kaspersky

合計を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
0
Babu