ou, se não quiser usar uma compreensão de lista ou quiser usar uma base diferente de 10
from __future__ import division # for compatibility of // between Python 2 and 3defdigits(number, base=10):assert number >= 0if number == 0:
return [0]
l = []
while number > 0:
l.append(number % base)
number = number // base
return l
Como você pode ver, isso renderá dígitos da direita para a esquerda. Se quiser os dígitos da esquerda para a direita, você precisará criar uma sequência a partir deles e, em seguida, invertê-la:
reversed(tuple(digitize(x)))
Você também pode usar esta função para conversão de base ao dividir o inteiro. O exemplo a seguir divide um número hexadecimal em nibbles binários como tuplas:
Embora list(map(int, str(x)))seja a abordagem pitônica, você pode formular lógica para derivar dígitos sem qualquer conversão de tipo:
from math import log10
defdigitize(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]
Um dos benefícios de um gerador é que você pode alimentar continuamente para set, tuple, next, etc, sem qualquer lógica adicional.
de acordo com as respostas anteriores, as strings são iteráveis, portanto, se precisar de uma lista de seus dígitos, você pode anexá-la um a um usando:
list(map(int,str(12345)))
[int(i) for i in str(number)]
ou, se não quiser usar uma compreensão de lista ou quiser usar uma 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
fonte
divmod
Prefiro não transformar um inteiro em uma string, então aqui está a função que uso para isso:
def digitize(n, base=10): if n == 0: yield 0 while n: n, d = divmod(n, base) yield d
Exemplos:
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 você pode ver, isso renderá dígitos da direita para a esquerda. Se quiser os dígitos da esquerda para a direita, você precisará criar uma sequência a partir deles e, em seguida, invertê-la:
Você também pode usar esta função para conversão de base ao dividir o inteiro. O exemplo a seguir divide um número hexadecimal em nibbles binários 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))
Observe que este método não trata decimais, mas pode ser adaptado para.
fonte
como @nd diz, mas usando a função interna de int para converter para uma 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]
Não sei qual é o objetivo final, mas dê uma olhada também dentro do módulo decimal do python para fazer coisas como
>>> Decimal('3.1415926535') + Decimal('2.7182818285') Decimal('5.85987')
fonte
Decimal
é inútil para esta perguntaEmbora
list(map(int, str(x)))
seja a abordagem pitônica, você pode formular lógica para derivar dígitos sem qualquer conversão 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]
Um dos benefícios de um gerador é que você pode alimentar continuamente para
set
,tuple
,next
, etc, sem qualquer lógica adicional.fonte
Dividindo um único número em seus dígitos (conforme respondido por todos):
>>> [int(i) for i in str(12345)] [1, 2, 3, 4, 5]
Mas, para obter dígitos de uma lista de números:
>>> [int(d) for d in ''.join(str(x) for x in [12, 34, 5])] [1, 2, 3, 4, 5]
Portanto, gostaria de saber, se podemos fazer o acima, de forma mais eficiente.
fonte
Talvez
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.split
é seu amigo, também usamosmap
oulist comprehension
para obter uma lista, (divida o que juntamos :-)).fonte
Outra solução que não envolve a conversão de / para strings:
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))]
fonte
Strings são tão iteráveis quanto arrays, portanto, basta convertê-los em string:
str(12345)
fonte
int
não éstr
Ingsde acordo com as respostas anteriores, as strings são iteráveis, portanto, se precisar de uma lista de seus dígitos, você pode anexá-la um a um usando:
digits = [] digits += str(12345)
fonte