it-swarm.com.de

Wie konvertiere ich eine Liste mit mehreren Ganzzahlen in eine einzelne Ganzzahl?

Wie konvertiere ich eine Liste in Python 3.5 wie:

x=[1, 3, 5]

auf ein int von 135 (ein ganzes int)?

14
chess_predictor

Wenn Sie eine Liste von ints haben und diese zusammenfügen möchten, können Sie map mit str verwenden, um sie in Strings zu konvertieren, join sie in den leeren String umwandeln und dann mit in ints umwandeln. int .

Im Code sieht das so aus:

r = int("".join(map(str, x)))

und r hat jetzt den gewünschten Wert von 135.

Dies ist natürlich ein begrenzter Ansatz, der mit einigen Bedingungen einhergeht. Die betreffende Liste muss nichts anderes als positive ints (als Ihr Beispiel) oder Zeichenfolgen, die ints darstellen, enthalten. Andernfalls können die Schritte der Konvertierung in string fehlschlagen oder die Verknüpfung von (negativen) Zahlen wird unübersichtlich. 

Hier ist ein mathematischerer Weg, der nicht in String konvertiert werden muss. Beachten Sie, dass dies nur funktioniert, wenn 0 <= i <= 9 ist.

>>> x = [1, 3, 5]
>>> sum(d * 10**i for i, d in enumerate(x[::-1]))
135

Die Idee ist, jedes Element in der Liste mit der entsprechenden Potenz von 10 zu multiplizieren und dann das Ergebnis zu summieren.

30
brianpck

Verwenden Sie nur Mathematik (keine Konvertierungen in oder aus Zeichenfolgen), können Sie die reduce-Funktion verwenden (functools.reduce in Python 3).

b = reduce(lambda total, d: 10*total + d, x, 0)

Hierfür wird die Horner-Regel verwendet, durch die das Polynom, das die Zahl darstellt, die Anzahl der Multiplikationen reduziert. Zum Beispiel,

1357 = 1*10*10*10 + 3*10*10 + 5*10 + 7     # 6 multiplications
     = ((1*10 + 3)*10 + 5)*10 + 7          # 3 multiplications

Dies führt dazu, dass dies schneller ist als das Berechnen von 10 oder das Erstellen einer Zeichenfolge und das Konvertieren des Ergebnisses in eine Ganzzahl.

>>> timeit.timeit('reduce(lambda t,d: 10*t+d, x, 0)', 'from functools import reduce; x=[1,3,5,7]')
0.7217515400843695
>>> timeit.timeit('int("".join(map(str, [1,3,5,7])))')
1.425914661027491
>>> timeit.timeit('sum(d * 10**i for i, d in enumerate(x[::-1]))', 'x=[1,3,5,7]')
1.897974518011324

In Fairness ist die String-Umwandlung schneller, wenn die Anzahl der Ziffern größer wird.

>>> import timeit

# 30 digits
>>> setup='from functools import reduce; x=[5, 2, 6, 8, 4, 6, 6, 4, 8, 0, 3, 1, 7, 6, 8, 2, 9, 9, 9, 5, 4, 5, 5, 4, 3, 6, 9, 2, 2, 1]' 
>>> print(timeit.timeit('reduce(lambda t,d: 10*t+d, x, 0)', setup))
6.520374411018565
>>> print(timeit.timeit('int("".join(map(str, x)))', setup))
6.797425839002244
>>> print(timeit.timeit('sum(d * 10**i for i, d in enumerate(x[::-1]))', setup))
19.430233853985555

# 60 digits
>>> setup='from functools import reduce; x=2*[5, 2, 6, 8, 4, 6, 6, 4, 8, 0, 3, 1, 7, 6, 8, 2, 9, 9, 9, 5, 4, 5, 5, 4, 3, 6, 9, 2, 2, 1]' 
>>> print(timeit.timeit('reduce(lambda t,d: 10*t+d, x, 0)', setup))
13.648188541992567
>>> print(timeit.timeit('int("".join(map(str, x)))', setup))
12.864593736943789
>>> print(timeit.timeit('sum(d * 10**i for i, d in enumerate(x[::-1]))', setup))
44.141602706047706

# 120 digits!
>>> setup='from functools import reduce; x=4*[5, 2, 6, 8, 4, 6, 6, 4, 8, 0, 3, 1, 7, 6, 8, 2, 9, 9, 9, 5, 4, 5, 5, 4, 3, 6, 9, 2, 2, 1]' 
>>> print(timeit.timeit('reduce(lambda t,d: 10*t+d, x, 0)', setup))
28.364255172084086
>>> print(timeit.timeit('int("".join(map(str, x)))', setup))
25.184791765059344
>>> print(timeit.timeit('sum(d * 10**i for i, d in enumerate(x[::-1]))', setup))
99.88558598596137
23
chepner

Wenn Sie keine Karte mögen, können Sie immer ein Listenverständnis verwenden:

s = [str(i) for i in x]
r = int("".join(s))
1
user6774416