Ich habe ein Tupel von Tupeln aus einer MySQL-Abfrage wie diese:
T1 = (('13', '17', '18', '21', '32'),
('07', '11', '13', '14', '28'),
('01', '05', '06', '08', '15', '16'))
Ich möchte alle String-Elemente in Ganzzahlen konvertieren und sie wieder in eine Liste von Listen einfügen:
T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]
Ich habe versucht, dies mit eval
zu erreichen, habe aber noch kein vernünftiges Ergebnis erhalten.
int()
ist die in Python standardmäßig eingebaute Funktion zur Umwandlung einer Zeichenkette in einen Integer-Wert. Sie rufen sie mit einer Zeichenkette auf, die eine Zahl als Argument enthält, und sie gibt die in eine ganze Zahl umgewandelte Zahl zurück:
print (int("1") + 1)
Das obige Beispiel gibt 2
aus.
Wenn Sie die Struktur Ihrer Liste T1 kennen (dass sie einfach 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]
Sie können dies mit einem Listenverständnis tun:
T2 = [[int(column) for column in row] for row in T1]
Das innere Listenverständnis ([int(column) for column in row]
) baut eine Liste
von int
aus einer Folge von int
-fähigen Objekten, wie z.B. Dezimalstrings, in row
. Das äußere Listenverständnis ([... für Zeile in T1])
) erstellt eine Liste der Ergebnisse des inneren Listenverständnisses, die auf jedes Element in T1
angewendet wird.
Das Codeschnipsel schlägt fehl, wenn eine der Zeilen Objekte enthält, die nicht mit int
konvertiert werden können. Sie brauchen eine intelligentere Funktion, wenn Sie Zeilen mit nicht-dezimalen Zeichenfolgen verarbeiten wollen.
Wenn Sie die Struktur der Zeilen kennen, können Sie das innere Listenverständnis durch einen Aufruf einer Funktion der Zeile ersetzen. Beispiel.
T2 = [parse_a_row_of_T1(row) for row in T1]
Wenn es sich nur um ein Tupel von Tupeln handelt, wird etwas wie rows=[map(int, row) for row in rows]
den Zweck erfüllen. (Es gibt ein Listenverständnis und einen Aufruf von map(f, lst), der gleich ist wie [f(a) for a in lst], darin).
Eval ist nicht das, was Sie tun wollen, für den Fall, dass es aus irgendeinem Grund etwas wie __import__("os").unlink("importantsystemfile")
in Ihrer Datenbank gibt.
Überprüfen Sie immer Ihre Eingaben (wenn Sie sonst nichts haben, wird die Ausnahme int() ausgelöst, wenn Sie eine falsche Eingabe haben).