La somme des chiffres d'un nombre - python

, Si je veux trouver la somme des chiffres d'un nombre, c'est à dire :

  • Entrée: 932
  • Sortie: 14, qui est (9 + 3 + 2)

Quel est le moyen le plus rapide de le faire?

J'ai instinctivement fait:

sum(int(digit) for digit in str(number))

Et j'ai trouvé ceci en ligne:

sum(map(int, str(number)))

Quel est le meilleur à utiliser pour la vitesse, et y a-t-il d'autres méthodes qui sont encore plus rapides?

50
demandé sur vaultah 2013-02-18 19:41:06

11 réponses

Vous pouvez le faire purement en entiers, et ce sera le plus efficace:

def sum_digits(n):
    s = 0
    while n:
        s += n % 10
        n //= 10
    return s

Ou avec divmod:

def sum_digits2(n):
    s = 0
    while n:
        n, remainder = divmod(n, 10)
        s += remainder
    return s

Mais les deux lignes que vous avez affichées sont bien.

 

Encore plus rapide est la version sans affectations augmentées:

def sum_digits3(n):
   r = 0
   while n:
       r, n = r + n % 10, n // 10
   return r

 

> %timeit sum_digits(n)
1000000 loops, best of 3: 574 ns per loop

> %timeit sum_digits2(n)
1000000 loops, best of 3: 716 ns per loop

> %timeit sum_digits3(n)
1000000 loops, best of 3: 479 ns per loop

> %timeit sum(map(int, str(n)))
1000000 loops, best of 3: 1.42 us per loop

> %timeit sum([int(digit) for digit in str(n)])
100000 loops, best of 3: 1.52 us per loop

> %timeit sum(int(digit) for digit in str(n))
100000 loops, best of 3: 2.04 us per loop
88
répondu Pavel Anossov 2016-01-07 17:32:31

Si vous voulez continuer à additionner les chiffres jusqu'à ce que vous obteniez un numéro à un chiffre (une de mes caractéristiques préférées des nombres divisibles par 9) Vous pouvez faire:

def digital_root(n):
    x = sum(int(digit) for digit in str(n))
    if x < 10:
        return x
    else:
        return digital_root(x)

Ce qui s'avère être assez rapide lui-même...

%timeit digital_root(12312658419614961365)

10000 loops, best of 3: 22.6 µs per loop
9
répondu d8aninja 2016-09-27 21:13:35

Cela pourrait aider

def digit_sum(n):
    num_str = str(n)
    sum = 0
    for i in range(0, len(num_str)):
        sum += int(num_str[i])
    return sum
3
répondu Aftab Lateef 2016-09-06 09:31:17

Faire quelques défis Codecademy j'ai résolu ceci comme:

def digit_sum(n):
arr = []
nstr = str(n)
for x in nstr:
    arr.append(int(x))
return sum(arr)
1
répondu Tsvetelin Tsvetkov 2017-04-29 16:20:17

Vous pouvez également utiliser ceci:

def sum_digits(num):
    num = str(num)
    digitSum = 0
    for i in num:
        digitSum += int(i)
    return digitSum
print sum_digits(875)
1
répondu Sam Mendes 2017-07-08 23:42:48
def digitsum(n):
    result = 0
    for i in range(len(str(n))):
        result = result + int(str(n)[i:i+1])
    return(result)

"result" est initialisé avec 0.

À l'intérieur de la boucle for, le nombre (n) est converti en une chaîne à diviser avec l'index de boucle(i) et obtenir chaque chiffre. ---> str(n)[i:i+1]

C'tranches de chiffres est converti en un entier ----> int(str(n)[i:i+1])

Et donc ajouté au résultat.

0
répondu Arghyadeep Giri 2018-01-22 17:51:52
def sumOfDigits():

    n=int(input("enter digit:")) 
    sum=0
    while n!=0 :

        m=n%10
        n=n/10
        sum=int(sum+m)

    print(sum)

sumOfDigits()
0
répondu itachi 2018-09-21 18:14:36

La meilleure façon est d'utiliser une compréhension de liste:

sum([int(digit) for digit in str(abs(number))])
-1
répondu dapaz 2018-01-12 16:17:59
num = 123
dig = 0
sum = 0
while(num > 0):
  dig = int(num%10)
  sum = sum+dig
  num = num/10

Print(somme) // assurez-vous d'ajouter de l'espace au-dessus de cette ligne

-1
répondu Jayant Pandey 2018-03-05 12:43:30

Vous pouvez essayer ceci

def sumDigits(number):
    sum = 0
    while(number>0):
        lastdigit = number%10
        sum += lastdigit
        number = number//10

    return sum
-1
répondu Julisam 2018-08-13 16:46:56
n = str(input("Enter the number\n"))

list1 = []

for each_number in n:

        list1.append(int(each_number))

print(sum(list1))
-3
répondu Abdullah Asif 2017-06-09 14:24:05