Ich habe ein Tupel von Tupeln 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 von Listen einfügen:
T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]
Ich habe versucht, es mit zu erreichen, eval
aber noch kein anständiges Ergebnis erzielt.
Antworten:
int()
ist die in Python integrierte Standardfunktion zum Konvertieren eines Strings in einen ganzzahligen Wert. Sie rufen es mit einer Zeichenfolge auf, die eine Zahl als Argument enthält, und es gibt die in eine Ganzzahl konvertierte Zahl zurück:Die obigen Drucke
2
.Wenn Sie die Struktur Ihrer Liste T1 kennen (die lediglich Listen enthält, nur eine Ebene), können Sie dies in Python 2 tun:
In Python 3:
quelle
T2 = map(lambda lol: map(int, lol), T1)
? Entweder Karten- oder Listenverständnisse, beides ist albern;)Sie können dies mit einem Listenverständnis tun:
Das innere Listenverständnis (
[int(column) for column in row]
) baut einlist
vonint
s aus einer Folge vonint
-able Objekten wie Dezimalzeichenfolgen in aufrow
. Das äußere Listenverständnis ([... for row in T1])
) erstellt eine Liste der Ergebnisse des inneren Listenverständnisses, das auf jedes Element in angewendet wirdT1
.Das Code-Snippet schlägt fehl, wenn eine der Zeilen Objekte enthält, die nicht konvertiert werden können
int
. Sie benötigen eine intelligentere Funktion, wenn Sie Zeilen mit nicht dezimalen Zeichenfolgen verarbeiten möchten.Wenn Sie die Struktur der Zeilen kennen, können Sie das Verständnis der inneren Liste durch einen Aufruf einer Funktion der Zeile ersetzen. Z.B.
quelle
Ich würde lieber nur Verständnislisten verwenden:
quelle
Anstatt zu setzen
int( )
, setzen Sie,float( )
wodurch Sie Dezimalstellen zusammen mit ganzen Zahlen verwenden können.quelle
Ich würde allen bisherigen Antworten zustimmen, aber das Problem ist, dass wenn Sie nicht alle ganzen Zahlen haben, diese abstürzen.
Wenn Sie dann Nicht-Ganzzahlen ausschließen möchten
Dies ergibt nur tatsächliche Ziffern. Der Grund, warum ich kein direktes Listenverständnis verwende, ist, dass das Listenverständnis ihre internen Variablen verliert.
quelle
isdigit
ist schwierig, probier es an-1
.int(<str>)
ist der Weg, um durchtry
/ zu überprüfenexcept
.quelle
Versuche dies.
x ist eine Zeichenfolge, weil sie in Anführungszeichen gesetzt ist, aber eine Zahl enthält.
Da x die Nummer 1 enthält, kann ich sie in eine Ganzzahl umwandeln.
Um festzustellen, ob eine Zeichenfolge eine Zahl ist, können Sie dies tun.
Es sollte in IDLE True gedruckt werden, da x eine Zahl ist.
Es sollte in IDLE False gedruckt werden, da y keine Zahl ist.
quelle
x.isnumeric()
.Listenverständnis verwenden:
quelle
In Python 3.5.1 funktionieren solche Dinge:
und
George.
quelle
Siehe diese Funktion
Dann
Sie können auch überprüfen
quelle
eval
ist böse: du solltest es durch ersetzenast.literal_eval
.Noch eine funktionale Lösung für Python 2:
Python 3 wird allerdings etwas chaotisch sein:
Wir können dies mit einem Wrapper beheben
quelle
Wenn es nur ein Tupel von Tupeln ist, reicht so etwas aus
rows=[map(int, row) for row in rows]
. (Es gibt dort ein Listenverständnis und einen Aufruf zur Zuordnung (f, lst), der gleich [f (a) für a in lst] ist.)Eval ist nicht das, was Sie tun möchten, falls sich
__import__("os").unlink("importantsystemfile")
aus irgendeinem Grund so etwas in Ihrer Datenbank befindet. Überprüfen Sie immer Ihre Eingabe (wenn nichts anderes vorhanden ist, wird die Ausnahme int () ausgelöst, wenn Sie eine schlechte Eingabe haben).quelle
Sie können so etwas tun:
quelle
Ich möchte eine verfügbare Option teilen, die hier noch nicht erwähnt zu sein scheint:
Erzeugt eine zufällige Permutation des Arrays x. Nicht genau das , wonach Sie gefragt haben, aber es ist eine mögliche Lösung für ähnliche Fragen.
quelle