This sum of digits can be considered as the sum of digits without shamanism with the translation into a string and back:
from __future__ import division import timeit def sum_digits(number): summ = 0 ab_numb = abs(number) divm = divmod while ab_numb > 10: ab_numb, remainder = divm(ab_numb, 10) summ += remainder if number > 0: return summ + ab_numb else: return summ - ab_numb
Now compare all the solutions:
def sumDigits(number): return sum([int(i) for i in str(abs(number))]) def sumDigits_eval(number): return eval('+'.join([i for i in str(number)])) def sumDigits_regex(number): return sum([int(x) for x in re.findall('(?:-)?\d', str(number))]) print("Math: ", timeit.repeat("sum_digits(-34543)", "from __main__ import sum_digits", number=100000)) print("Str: ", timeit.repeat("sumDigits(-34543)", "from __main__ import sumDigits", number=100000)) print("Eval: ", timeit.repeat("sumDigits_eval(-34543)", "from __main__ import sumDigits_eval", number=100000)) print("Regexp: ", timeit.repeat("sumDigits_regex(-34543)", "from __main__ import sumDigits_regex", number=100000)) >>> Math: [0.24735833889623768, 0.24581550535393623, 0.24613614212789509] >>> Str: [0.407044484349559, 0.4065382805822204, 0.4061474403660761] >>> Eval: [2.771394191096233, 2.761938895909233, 2.76689131768166] >>> Regexp: [0.8407116740523968, 0.837011418938836, 0.835758841733524] print("Math: ", timeit.repeat("sum_digits(-310104588999943)", "from __main__ import sum_digits", number=100000)) print("Str: ", timeit.repeat("sumDigits(-310104588999943)", "from __main__ import sumDigits", number=100000)) >>> Math: [0.7094168680396982, 0.7092928830131481, 0.7118370393360973] >>> Str: [0.9090130545558752, 0.9149762416771967, 0.9091776836805323]
sumDigits(-35)should be equal to 2. What is the task you are facing, that with the sum of digits of a negative number the first digit is subtracted from the sum of the others? How do you expect the result, for example, from the source numbers-911,-10000? - tutankhamun