Ich habe Python-Code, der eine Liste von Zeichenfolgen durchläuft und diese nach Möglichkeit in Ganzzahlen oder Gleitkommazahlen konvertiert. Dies für ganze Zahlen zu tun ist ziemlich einfach
if element.isdigit():
newelement = int(element)
Gleitkommazahlen sind schwieriger. Im Moment teile ich partition('.')
die Zeichenfolge und überprüfe, ob eine oder beide Seiten Ziffern sind.
partition = element.partition('.')
if (partition[0].isdigit() and partition[1] == '.' and partition[2].isdigit())
or (partition[0] == '' and partition[1] == '.' and partition[2].isdigit())
or (partition[0].isdigit() and partition[1] == '.' and partition[2] == ''):
newelement = float(element)
Das funktioniert, aber offensichtlich ist die if-Aussage dafür ein bisschen wie ein Bär. Die andere Lösung, die ich in Betracht gezogen habe, besteht darin, die Konvertierung einfach in einen Try / Catch-Block zu packen und zu prüfen, ob sie erfolgreich ist, wie in dieser Frage beschrieben .
Hat jemand andere Ideen? Meinungen zu den relativen Vorzügen der Partition und Try / Catch-Ansätzen?
quelle
Python-Methode zur Überprüfung auf float:
Lassen Sie sich nicht von den Kobolden beißen, die sich im Schwimmboot verstecken! TESTEN SIE DIE EINHEIT!
Was ist und was nicht, kann Sie überraschen:
quelle
isfloat(" 1.23 ")
undisfloat(" \n \t 1.23 \n\t\n")
. Nützlich bei Webanfragen; Es ist nicht erforderlich, zuerst Leerzeichen zu kürzen.Dies wird
true
nur zurückgegeben, wenn es ein oder kein '.' gibt. in der Ziffernfolge.wird zurückkehren
false
wird zurückkehren
false
quelle
[i for i in df[i].apply(lambda x: str(x).replace('.','').isdigit()).any()]
TL; DR :
try: except:
Methode die beste native Python-Methode.Es gibt eine andere Methode, die über ein Drittanbieter-Modul namens Fastnumbers verfügbar ist (Offenlegung, ich bin der Autor). Es bietet eine Funktion namens isfloat . Ich habe das von Jacob Gabrielson in dieser Antwort skizzierte Beispiel genommen , aber die
fastnumbers.isfloat
Methode hinzugefügt . Ich sollte auch beachten, dass Jacobs Beispiel der Regex-Option nicht gerecht wurde, da die meiste Zeit in diesem Beispiel aufgrund des Punktoperators für globale Suchvorgänge aufgewendet wurde ... Ich habe diese Funktion geändert, um einen faireren Vergleich zu ermöglichentry: except:
.Auf meinem Computer lautet die Ausgabe:
Wie Sie sehen können, ist Regex nicht so schlecht, wie es ursprünglich schien, und wenn Sie ein echtes Bedürfnis nach Geschwindigkeit haben, ist die
fastnumbers
Methode ziemlich gut.quelle
Wenn Sie sich um die Leistung gekümmert haben (und ich schlage nicht vor, dass Sie dies tun sollten), ist der try-basierte Ansatz der klare Gewinner (im Vergleich zu Ihrem partitionbasierten Ansatz oder dem Regexp-Ansatz), solange Sie nicht viel erwarten ungültige Zeichenfolgen. In diesem Fall ist sie möglicherweise langsamer (vermutlich aufgrund der Kosten für die Ausnahmebehandlung).
Auch hier schlage ich nicht vor, dass Sie sich für die Leistung interessieren, sondern nur die Daten für den Fall, dass Sie dies 10 Milliarden Mal pro Sekunde tun, oder so. Außerdem verarbeitet der partitionbasierte Code nicht mindestens eine gültige Zeichenfolge.
Hier ist der Code (Python 2.6, regulärer Ausdruck aus John Gietzens Antwort ):
quelle
Nur für Abwechslung ist hier eine andere Methode, um es zu tun.
Bearbeiten: Ich bin mir sicher, dass es nicht allen Fällen von Float standhält, besonders wenn es einen Exponenten gibt. Um das zu lösen, sieht es so aus. Dies gibt True zurück. Nur val ist ein Float und False für int, ist aber wahrscheinlich weniger performant als Regex.
quelle
Diese Regex prüft auf wissenschaftliche Gleitkommazahlen:
Ich glaube jedoch, dass Ihre beste Wette darin besteht, den Parser bei einem Versuch zu verwenden.
quelle
Wenn Sie sich nicht um wissenschaftliche oder andere Ausdrücke von Zahlen kümmern müssen und nur mit Zeichenfolgen arbeiten, die Zahlen mit oder ohne Punkt sein können:
Funktion
Lambda-Version
Beispiel
Auf diese Weise konvertieren Sie nicht versehentlich ein Int in einen Float.
quelle
Vereinfachte Version der Funktion
is_digit(str)
, die in den meisten Fällen ausreicht (ohne Berücksichtigung der Exponentialschreibweise und des "NaN" -Werts):quelle
Ich habe die bereits erwähnte Funktion verwendet, aber bald stelle ich fest, dass Zeichenfolgen wie "Nan", "Inf" und ihre Variation als Zahl betrachtet werden. Daher schlage ich vor, dass Sie eine verbesserte Version der Funktion haben, die bei dieser Art von Eingabe false zurückgibt und "1e3" -Varianten nicht fehlschlägt:
quelle
if text.isalpha():
Scheck beginnen?Versuchen Sie, in Float umzuwandeln. Wenn ein Fehler auftritt, drucken Sie die ValueError-Ausnahme.
Ausgabe:
quelle
Wenn Sie das Wörterbuch als Argument übergeben, werden Zeichenfolgen konvertiert, die in float konvertiert werden können, und andere werden verlassen
quelle
Ich habe nach einem ähnlichen Code gesucht, aber es sieht so aus, als wäre die Verwendung von try / excepts der beste Weg. Hier ist der Code, den ich benutze. Es enthält eine Wiederholungsfunktion, wenn die Eingabe ungültig ist. Ich musste überprüfen, ob die Eingabe größer als 0 war, und wenn ja, sie in einen Float umwandeln.
quelle
quelle
Ich habe einige der oben genannten einfachen Optionen ausprobiert und dabei einen Versuchstest zum Konvertieren in einen Float verwendet. Dabei stellte ich fest, dass in den meisten Antworten ein Problem vorliegt.
Einfacher Test (gemäß den obigen Antworten):
Das Problem tritt auf, wenn:
Sie versuchen dann,
float('-')
was fehlschlägtSie versuchen dann,
float('')
was ebenfalls ebenfalls fehlschlägtDie schnelle Lösung, die ich hatte, ist:
quelle
scheint einfach zu sein.
Behandelt Werte, die als Zeichenfolge oder int oder float gespeichert sind
quelle