oder wenn Sie kein Listenverständnis verwenden möchten oder eine andere Basis als 10 verwenden möchten
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
Wie Sie sehen können, ergibt dies Ziffern von rechts nach links. Wenn Sie die Ziffern von links nach rechts möchten, müssen Sie daraus eine Sequenz erstellen und diese dann umkehren:
reversed(tuple(digitize(x)))
Sie können diese Funktion auch für die Basiskonvertierung verwenden, wenn Sie die Ganzzahl teilen. Im folgenden Beispiel wird eine Hexadezimalzahl als Tupel in binäre Halbbytes aufgeteilt:
Während dies list(map(int, str(x)))der pythonische Ansatz ist, können Sie eine Logik formulieren, um Ziffern ohne Typkonvertierung abzuleiten:
from math import log10
defdigitize(x):
n = int(log10(x))
for i inrange(n, -1, -1):
factor = 10**i
k = x // factor
yield k
x -= k * factor
res = list(digitize(5243))
[5, 2, 4, 3]
Ein Vorteil eines Generators ist , dass Sie nahtlos ernähren können set, tuple, nextusw, ohne zusätzliche Logik.
Gemäß den vorherigen Antworten sind Zeichenfolgen iterierbar. Wenn Sie also eine Liste Ihrer Ziffern benötigen, können Sie diese einzeln anhängen, indem Sie Folgendes verwenden:
list(map(int,str(12345)))
[*map(int,str(12345))]
[int(i) for i in str(number)]
oder wenn Sie kein Listenverständnis verwenden möchten oder eine andere Basis als 10 verwenden möchten
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
quelle
divmod
Ich möchte lieber keine Ganzzahl in eine Zeichenfolge umwandeln. Hier ist die Funktion, die ich dafür verwende:
def digitize(n, base=10): if n == 0: yield 0 while n: n, d = divmod(n, base) yield d
Beispiele:
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)
Wie Sie sehen können, ergibt dies Ziffern von rechts nach links. Wenn Sie die Ziffern von links nach rechts möchten, müssen Sie daraus eine Sequenz erstellen und diese dann umkehren:
reversed(tuple(digitize(x)))
Sie können diese Funktion auch für die Basiskonvertierung verwenden, wenn Sie die Ganzzahl teilen. Im folgenden Beispiel wird eine Hexadezimalzahl als Tupel in binäre Halbbytes aufgeteilt:
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))
Beachten Sie, dass diese Methode keine Dezimalstellen verarbeitet, sondern an angepasst werden kann.
quelle
wie @nd sagt, aber mit der eingebauten Funktion von int in eine andere Basis konvertieren
>>> [ 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]
Ich weiß nicht, was das Endziel ist, aber werfen Sie auch einen Blick in das Dezimalmodul von Python, um solche Dinge zu tun
>>> Decimal('3.1415926535') + Decimal('2.7182818285') Decimal('5.85987')
quelle
Decimal
ist für diese Frage nutzlosWährend dies
list(map(int, str(x)))
der pythonische Ansatz ist, können Sie eine Logik formulieren, um Ziffern ohne Typkonvertierung abzuleiten: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]
Ein Vorteil eines Generators ist , dass Sie nahtlos ernähren können
set
,tuple
,next
usw, ohne zusätzliche Logik.quelle
Teilen einer einzelnen Zahl in ihre Ziffern (wie von allen beantwortet):
>>> [int(i) for i in str(12345)] [1, 2, 3, 4, 5]
Aber um Ziffern aus einer Liste von Zahlen zu erhalten:
>>> [int(d) for d in ''.join(str(x) for x in [12, 34, 5])] [1, 2, 3, 4, 5]
Ich würde gerne wissen, ob wir das oben Genannte effizienter machen können.
quelle
Vielleicht
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
ist dein Freund, auch wir benutzenmap
oderlist comprehension
um eine Liste zu bekommen (teile was wir beitreten :-)).quelle
Eine andere Lösung, bei der keine Konvertierung in / von Zeichenfolgen erforderlich ist:
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))]
quelle
Strings sind genauso iterierbar wie Arrays. Konvertieren Sie sie einfach in einen String:
str(12345)
quelle
int
s nichtstr
IngsGemäß den vorherigen Antworten sind Zeichenfolgen iterierbar. Wenn Sie also eine Liste Ihrer Ziffern benötigen, können Sie diese einzeln anhängen, indem Sie Folgendes verwenden:
digits = [] digits += str(12345)
quelle