¿Dividir enteros en Python?

87

Se supone que mi entrada de entero 12345, quiero dividirla y ponerla en una matriz como 1, 2, 3, 4, 5. ¿Cómo podré hacerlo?

Paleto
fuente

Respuestas:

138
>>> [int(i) for i in str(12345)]

[1, 2, 3, 4, 5]
luc
fuente
91

devolver matriz como cadena

>>> list(str(12345))
['1', '2', '3', '4', '5']

devolver matriz como entero

>>> map(int,str(12345))
[1, 2, 3, 4, 5]

fuente
24
En Python3, eso seríalist(map(int,str(12345)))
Serge Stroobandt
10
[int(i) for i in str(number)]

o, si no desea usar una lista de comprensión o si desea usar una base diferente de 10

from __future__ import division # for compatibility of // between Python 2 and 3
def digits(number, base=10):
    assert number >= 0
    if number == 0:
        return [0]
    l = []
    while number > 0:
        l.append(number % base)
        number = number // base
    return l
Dakota del Norte.
fuente
Buena llamada, esto era lo que estaba a punto de escribir :)
Russell
@y puede poner la base del número dentro de int como int (i, 2) para binario vea mi publicación
fabrizioM
Esta es una buena respuesta, pero se beneficiaría del uso dedivmod
Shayaan
5

Prefiero no convertir un número entero en una cadena, así que aquí está la función que uso para esto:

def digitize(n, base=10):
    if n == 0:
        yield 0
    while n:
        n, d = divmod(n, base)
        yield d

Ejemplos:

tuple(digitize(123456789)) == (9, 8, 7, 6, 5, 4, 3, 2, 1)
tuple(digitize(0b1101110, 2)) == (0, 1, 1, 1, 0, 1, 1)
tuple(digitize(0x123456789ABCDEF, 16)) == (15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)

Como puede ver, esto producirá dígitos de derecha a izquierda. Si desea los dígitos de izquierda a derecha, deberá crear una secuencia a partir de ella y luego invertirla:

reversed(tuple(digitize(x)))

También puede usar esta función para la conversión de base mientras divide el entero. El siguiente ejemplo divide un número hexadecimal en nibbles binarios como tuplas:

import itertools as it
tuple(it.zip_longest(*[digitize(0x123456789ABCDEF, 2)]*4, fillvalue=0)) == ((1, 1, 1, 1), (0, 1, 1, 1), (1, 0, 1, 1), (0, 0, 1, 1), (1, 1, 0, 1), (0, 1, 0, 1), (1, 0, 0, 1), (0, 0, 0, 1), (1, 1, 1, 0), (0, 1, 1, 0), (1, 0, 1, 0), (0, 0, 1, 0), (1, 1, 0, 0), (0, 1, 0, 0), (1, 0, 0, 0))

Tenga en cuenta que este método no maneja decimales, pero podría adaptarse a.

Will Da Silva
fuente
3

como @nd dice pero usando la función incorporada de int para convertir a una base diferente

>>> [ int(i,16) for i in '0123456789ABCDEF' ]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

>>> [int(i,2) for i in "100 010 110 111".split()]
[4, 2, 6, 7]

No sé cuál es el objetivo final, pero eche un vistazo también dentro del módulo decimal de Python para hacer cosas como

>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85987')
fabrizioM
fuente
Decimales inútil para esta pregunta
jamylak
1

Si bien list(map(int, str(x)))es el enfoque Pythonic, puede formular lógica para derivar dígitos sin ninguna conversión de tipo:

from math import log10

def digitize(x):
    n = int(log10(x))
    for i in range(n, -1, -1):
        factor = 10**i
        k = x // factor
        yield k
        x -= k * factor

res = list(digitize(5243))

[5, 2, 4, 3]

Uno de los beneficios de un generador es que se puede alimentar sin problemas a set, tuple, next, etc, sin ninguna lógica adicional.

jpp
fuente
0

Dividiendo un solo número en sus dígitos (como respondieron todos):

>>> [int(i) for i in str(12345)]
[1, 2, 3, 4, 5]

Pero, para obtener dígitos de una lista de números:

>>> [int(d) for d in ''.join(str(x) for x in [12, 34, 5])]
[1, 2, 3, 4, 5]

Así que me gustaría saber, si podemos hacer lo anterior, de manera más eficiente.

Nabeel Ahmed
fuente
0

Quizás join+ split:

>>> a=12345
>>> list(map(int,' '.join(str(a)).split()))
[1, 2, 3, 4, 5]
>>> [int(i) for i in ' '.join(str(a)).split()]
[1, 2, 3, 4, 5]
>>> 

str.join+ str.splites tu amigo, también usamos mapo list comprehensionpara obtener una lista, (dividir lo que unimos :-)).

U10-Adelante
fuente
0

Otra solución que no implica convertir a / desde cadenas:

from math import log10

def decompose(n):
    if n == 0:
        return [0]
    b = int(log10(n)) + 1
    return [(n // (10 ** i)) % 10 for i in reversed(range(b))]
Alexandre V.
fuente
-2

Las cadenas son tan iterables como las matrices, así que conviértalas en cadena:

str(12345)
relajarse
fuente
PO quiere intNO strIngs
jamylak
-2

de acuerdo con las respuestas anteriores, las cadenas son iterables, por lo que si necesita una lista de sus dígitos, puede agregarla uno por uno usando:

digits = []
digits += str(12345)
blz
fuente
No veo ningún error. El único problema es que el resultado es una lista de cadenas, no una lista de ints.
Paul Rooney