Saltar al contenido

Cómo tomar el enésimo dígito de un número en python

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *