Ganzzahl in Python teilen?

90

Meine ganzzahlige Eingabe ist vermutlich 12345, ich möchte sie teilen und in ein Array als einfügen 1, 2, 3, 4, 5. Wie kann ich das machen?

Hick
quelle

Antworten:

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

[1, 2, 3, 4, 5]
luc
quelle
94

Array als String zurückgeben

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

Array als Ganzzahl zurückgeben

>>> map(int,str(12345))
[1, 2, 3, 4, 5]
SIE
quelle
25
In Python3 wäre daslist(map(int,str(12345)))
Serge Stroobandt
Oder könnte auch sein[*map(int,str(12345))]
Tipi
10
[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
nd.
quelle
Guter Anruf, das war es, was ich schreiben wollte :)
Russell
@nd Sie können die Basis der Zahl in int wie int (i, 2) für binäre setzen, siehe meinen Beitrag
fabrizioM
Dies ist eine gute Antwort, würde aber von der Verwendung vondivmod
Shayaan
6

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.

Will Da Silva
quelle
3

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')
fabrizioM
quelle
Decimalist für diese Frage nutzlos
Jamylak
1

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

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, nextusw, ohne zusätzliche Logik.

jpp
quelle
0

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.

Nabeel Ahmed
quelle
0

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.splitist dein Freund, auch wir benutzen mapoder list comprehensionum eine Liste zu bekommen (teile was wir beitreten :-)).

U11-Vorwärts
quelle
0

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))]
Alexandre V.
quelle
-2

Strings sind genauso iterierbar wie Arrays. Konvertieren Sie sie einfach in einen String:

str(12345)
entspannen
quelle
OP will ints nicht strIngs
jamylak
-2

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:

digits = []
digits += str(12345)
blz
quelle
Ich sehe keine Fehler. Das einzige Problem ist, dass das Ergebnis eine Liste von Zeichenfolgen ist, keine Liste von Ints.
Paul Rooney