Сумма цифр в строке

если я только что прочитал свою функцию 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


person user1864828    schedule 27.01.2013    source источник
comment
а что у вас вместо 9?   -  person CharlesB    schedule 27.01.2013
comment
он производит 4, потому что он берет последнее число 3 и плюс 1 к нему, так как вы устанавливаете значение b каждый раз, когда запускаете цикл   -  person Thai Tran    schedule 27.01.2013


Ответы (8)


Обратите внимание, что вы можете легко решить эту проблему, используя встроенные функции. Это более идиоматичное и эффективное решение:

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(), как показано выше.

person Óscar López    schedule 27.01.2013
comment
Не работает ideone.com/EUAtZN - person HaseeB Mir; 08.05.2021
comment
@HaseeBMir, конечно, если не работает ... в ideone вам нужно явно распечатать результат. В моей реализации нет ничего плохого, она будет работать в любом реальном интерпретаторе, вы просто забыли добавить print(). Пожалуйста, удалите свой отрицательный голос, проблема в вашем коде, а не в моем. - person Óscar López; 08.05.2021
comment
@HaseeBMir, вы не должны тестировать чужой код в ideone, используйте настоящий интерпретатор, иначе вы получите неверные результаты. - person Óscar López; 08.05.2021
comment
ideone — самый точный редактор кода - person HaseeB Mir; 08.05.2021
comment
Тогда вам следует написать полный код для всех компиляторов и интерпретаторов. - person HaseeB Mir; 08.05.2021
comment
@HaseeBMir, почему бы вам не взглянуть на все остальные миллионы ответов Python, которые есть на этом сайте? если у вас есть свободное время, вы можете начать добавлять print() буквально ко всем из них, потому что, по-вашему, они все неправильные и должны работать на всех компиляторах и интерпретаторах, а ideone - самый точный редактор xD - person Óscar López; 08.05.2021
comment
Хорошо, не беспокойтесь, я удалил отрицательный голос, теперь я использую основные скомпилированные языки, не интерпретируемые, поэтому я думаю, что это нормально для языка Python. Ваше здоровье - person HaseeB Mir; 08.05.2021

Вы сбрасываете значение b на каждой итерации, если a является цифрой.

Возможно, вы хотите:

b += int(a)

Вместо:

b = int(a)
b += 1
person Alex Reynolds    schedule 27.01.2013
comment
вау это работает! не могли бы вы объяснить, почему мой не работал? - person user1864828; 27.01.2013
comment
Строка b = int(a) устанавливает значение b как целочисленное значение цифрового символа. Затем вы добавляете один к нему. В вашем примере последняя цифра — 3, поэтому вы устанавливаете b в 3, а затем добавляете 1, получая 4. Вместо этого вы хотите увеличить b на значение каждой цифры. - person Alex Reynolds; 27.01.2013

Другой способ использования встроенных функций — использование функции reduce:

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

Один лайнер

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

Я хотел бы предложить другое решение с использованием regx, которое охватывает два сценария:

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)))
person Santosh Pillai    schedule 03.10.2017

Другой способ сделать это:

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

Эквивалент для вашего кода с использованием списков:

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

Он будет работать быстрее, чем версия «для», и сэкономит много кода.

person kaspersky    schedule 27.01.2013

Просто вариант ответа @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
person Babu    schedule 17.08.2017