Este post ha sido probado por nuestros especialistas así aseguramos la veracidad de nuestra esta noticia.
Solución:
Puedes hacerlo con métodos de división entera y resto.
def get_digit(number, n):
return number // 10**n % 10
get_digit(987654321, 0)
# 1
get_digit(987654321, 5)
# 6
El //
realiza la división de enteros por una potencia de diez para mover el dígito a la posición de las unidades, luego el %
obtiene el resto después de la división por 10. Tenga en cuenta que la numeración en este esquema usa indexación cero y comienza desde el lado derecho del número.
Primero trate el número como un string
number = 9876543210
number = str(number)
Luego para obtener el primer dígito:
number[0]
El cuarto dígito:
number[3]
EDITAR:
Esto devolverá el dígito como un carácter, no como un número. Para volver a convertirlo usa:
int(number[0])
Tenía curiosidad acerca de la velocidad relativa de los dos enfoques populares: lanzar a string y usando aritmética modular, así que los perfilé y me sorprendió ver lo cerca que estaban en términos de rendimiento.
(Mi caso de uso era ligeramente diferente, quería obtener todos los dígitos del número).
El string enfoque dio:
10000002 function calls in 1.113 seconds
Ordered by: cumulative time
ncalls tottime percall cumtime percall filename:lineno(function)
10000000 1.113 0.000 1.113 0.000 sandbox.py:1(get_digits_str)
1 0.000 0.000 0.000 0.000 cProfile.py:133(__exit__)
1 0.000 0.000 0.000 0.000 method 'disable' of '_lsprof.Profiler' objects
Mientras que el enfoque aritmético modular dio:
10000002 function calls in 1.102 seconds
Ordered by: cumulative time
ncalls tottime percall cumtime percall filename:lineno(function)
10000000 1.102 0.000 1.102 0.000 sandbox.py:6(get_digits_mod)
1 0.000 0.000 0.000 0.000 cProfile.py:133(__exit__)
1 0.000 0.000 0.000 0.000 method 'disable' of '_lsprof.Profiler' objects
Se realizaron 10 ^ 7 pruebas con un tamaño de número máximo inferior a 10 ^ 28.
Código utilizado para la referencia:
def get_digits_str(num):
for n_str in str(num):
yield int(n_str)
def get_digits_mod(num, radix=10):
remaining = num
yield remaining % radix
while remaining := remaining // radix:
yield remaining % radix
if __name__ == '__main__':
import cProfile
import random
random_inputs = [random.randrange(0, 10000000000000000000000000000) for _ in range(10000000)]
with cProfile.Profile() as str_profiler:
for rand_num in random_inputs:
get_digits_str(rand_num)
str_profiler.print_stats(sort='cumtime')
with cProfile.Profile() as mod_profiler:
for rand_num in random_inputs:
get_digits_mod(rand_num)
mod_profiler.print_stats(sort='cumtime')
Comentarios y puntuaciones
Al final de la post puedes encontrar las anotaciones de otros desarrolladores, tú de igual forma tienes la libertad de dejar el tuyo si lo deseas.