web-dev-qa-db-de.com

Wie konvertiert man Strings in Ganzzahl in Python?

Ich habe ein Tuple Tupel aus einer MySQL-Abfrage wie folgt:

T1 = (('13', '17', '18', '21', '32'),
      ('07', '11', '13', '14', '28'),
      ('01', '05', '06', '08', '15', '16'))

Ich möchte alle Zeichenfolgenelemente in Ganzzahlen konvertieren und sie wieder in eine Liste mit Listen aufnehmen:

T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]

Ich habe versucht, es mit eval zu erreichen, bekam aber noch kein anständiges Ergebnis.

397
elfuego1

int() ist die in Python eingebaute Standardfunktion zum Konvertieren einer Zeichenfolge in einen Ganzzahlwert. Sie rufen es mit einer Zeichenfolge auf, die eine Zahl als Argument enthält, und gibt die in eine Ganzzahl konvertierte Zahl zurück:

print (int("1") + 1)

Das obige druckt 2.

Wenn Sie die Struktur Ihrer Liste kennen, T1 (die nur Listen enthält, nur eine Ebene), können Sie dies in Python 2 tun:

T2 = [map(int, x) for x in T1]

In Python 3:

T2 = [list(map(int, x)) for x in T1]
580
unwind

Sie können dies mit einem Listenverständnis machen:

T2 = [[int(column) for column in row] for row in T1]

Das innere Listenverständnis ([int(column) for column in row]) erstellt ein list aus ints aus einer Folge von int -fähigen Objekten, wie Dezimalzeichenfolgen, in row. Das äußere Listenverständnis ([... for row in T1])) bildet eine Liste der Ergebnisse des inneren Listenverständnisses, die auf jedes Element in T1 angewendet werden.

Das Code-Snippet schlägt fehl, wenn eine der Zeilen Objekte enthält, die von int nicht konvertiert werden können. Sie benötigen eine intelligentere Funktion, wenn Sie Zeilen verarbeiten möchten, die nicht dezimale Zeichenfolgen enthalten.

Wenn Sie die Struktur der Zeilen kennen, können Sie das innere Listenverständnis durch einen Aufruf einer Funktion der Zeile ersetzen. Z.B.

T2 = [parse_a_row_of_T1(row) for row in T1]
28
Will Harris

Ich möchte lieber nur Verständnislisten verwenden:

[[int(y) for y in x] for x in T1]
16
odwl

Anstelle von int( ) setzen Sie float( ), um Dezimalzahlen zusammen mit ganzen Zahlen zu verwenden.

13
weir99

Ich stimme mit den Antworten aller soweit überein, aber das Problem ist, dass sie abstürzen, wenn Sie nicht alle Zahlen haben.

Wenn Sie nicht ganze Zahlen ausschließen möchten

T1 = (('13', '17', '18', '21', '32'),
      ('07', '11', '13', '14', '28'),
      ('01', '05', '06', '08', '15', '16'))
new_list = list(list(int(a) for a in b) for b in T1 if a.isdigit())

Dies ergibt nur tatsächliche Ziffern. Der Grund, warum ich keine direkten Listenverständnisse verwende, ist, dass das Listenverständnis ihre internen Variablen durchläuft.

11
Christian Witts
T3=[]

for i in range(0,len(T1)):
    T3.append([])
    for j in range(0,len(T1[i])):
        b=int(T1[i][j])
        T3[i].append(b)

print T3
10
P.Hunter

Versuche dies.

x = "1"

x ist eine Zeichenfolge, da sie Anführungszeichen enthält, aber eine Zahl darin ist.

x = int(x)

Da x die Nummer 1 enthält, kann ich es in eine ganze Zahl umwandeln.

Um zu sehen, ob eine Zeichenfolge eine Zahl ist, können Sie dies tun.

def is_number(var):
    try:
        if var == int(var):
            return True
    except Exception:
        return False

x = "1"

y = "test"

x_test = is_number(x)

print(x_test)

Es sollte mit IDLE True gedruckt werden, da x eine Zahl ist.

y_test = is_number(y)

print(y_test)

Es sollte auf IDLE False gedruckt werden, da y keine Zahl enthält.

6

Verwenden von Listenverständnissen:

t2 = [map(int, list(l)) for l in t1]
4
Jon

In Python 3.5.1 funktionieren solche Dinge wie folgt:

c = input('Enter number:')
print (int(float(c)))
print (round(float(c)))

und

Enter number:  4.7
4
5

George.

4
George Moraitis

Siehe diese Funktion

def parse_int(s):
    try:
        res = int(eval(str(s)))
        if type(res) == int:
            return res
    except:
        return

Dann

val = parse_int('10')  # Return 10
val = parse_int('0')  # Return 0
val = parse_int('10.5')  # Return 10
val = parse_int('0.0')  # Return 0
val = parse_int('Ten')  # Return None

Sie können auch überprüfen

if val == None:  # True if input value can not be converted
    pass  # Note: Don't use 'if not val:'
3
Shameem

Noch eine funktionale Lösung für Python 2:

from functools import partial

map(partial(map, int), T1)

Python 3 wird allerdings etwas unordentlich sein:

list(map(list, map(partial(map, int), T1)))

wir können das mit einem Wrapper beheben

def oldmap(f, iterable):
    return list(map(f, iterable))

oldmap(partial(oldmap, int), T1)
3
Eli Korvigo

Wenn es nur ein Tupel von Tupeln ist, wird etwas wie rows=[map(int, row) for row in rows] den Trick tun. (Es gibt ein Listenverständnis und einen Aufruf zur Zuordnung (f, lst), der gleich [f (a) für a in lst] ist.)

Eval ist nicht was Sie tun möchten, falls in Ihrer Datenbank aus irgendeinem Grund etwas wie __import__("os").unlink("importantsystemfile") vorhanden ist ..__ Überprüfen Sie Ihre Eingabe immer (wenn nichts anderes, wird die Ausnahme int () ausgelöst, wenn Sie einen Fehler haben Eingang).

1
AKX

Ich möchte eine verfügbare Option freigeben, die hier noch nicht erwähnt zu werden scheint:

rumpy.random.permutation(x)

Erzeugt eine zufällige Permutation von Array x. Nicht genau was Sie verlangt haben, aber es ist eine mögliche Lösung für ähnliche Fragen.

0
samvoit4