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?

Antworten:


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

[1, 2, 3, 4, 5]

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]

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

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.


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')

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.


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.


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 :-)).


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))]

-2

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

str(12345)

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)

Ich sehe keine Fehler. Das einzige Problem ist, dass das Ergebnis eine Liste von Zeichenfolgen ist, keine Liste von Ints.
Paul Rooney
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.