Ich habe mich gefragt, was der einfachste Weg ist, eine string
Liste wie die folgende in eine zu konvertieren list
:
x = u'[ "A","B","C" , " D"]'
Auch für den Fall, dass der Benutzer Leerzeichen zwischen die Kommas und Leerzeichen innerhalb der Anführungszeichen setzt. Ich muss auch damit umgehen, um:
x = ["A", "B", "C", "D"]
in Python.
Ich weiß, dass ich mit strip()
und split()
mit dem Split-Operator Leerzeichen entfernen und nach Nicht-Alphabeten suchen kann. Aber der Code wurde sehr klobig. Gibt es eine schnelle Funktion, die mir nicht bekannt ist?
Antworten:
ast.literal_eval :
quelle
eval
nicht daranast.literal_eval
.ast.literal_eval
ist sicherer alseval
, aber es ist nicht wirklich sicher . In neueren Versionen der Dokumente wird Folgendes erklärt: "Warnung Es ist möglich, den Python-Interpreter aufgrund von Einschränkungen der Stapeltiefe im AST-Compiler von Python mit einer ausreichend großen / komplexen Zeichenfolge zum Absturz zu bringen." Es kann tatsächlich möglich sein, beliebigen Code über einen vorsichtigen Stack-Smashing-Angriff auszuführen, obwohl meines Wissens niemand einen öffentlichen Proof of Concept dafür erstellt.Das
json
Modul ist eine bessere Lösung , wenn es eine ist Zeichenfolge Liste der Wörterbücher. Diejson.loads(your_data)
Funktion kann verwendet werden, um es in eine Liste zu konvertieren.Ähnlich
quelle
'["a","b"]'
aber nicht für"['a','b']"
.Das
eval
ist gefährlich - Sie sollten keine Benutzereingaben ausführen.Wenn Sie 2.6 oder neuer haben, verwenden Sie ast anstelle von eval:
Sobald Sie das haben,
strip
die Saiten.Wenn Sie eine ältere Version von Python verwenden, können Sie mit einem einfachen regulären Ausdruck dem, was Sie wollen, sehr nahe kommen:
Dies ist nicht so gut wie die ast-Lösung. Beispielsweise werden maskierte Anführungszeichen in Zeichenfolgen nicht korrekt verarbeitet. Aber es ist einfach, beinhaltet keine gefährliche Bewertung und ist möglicherweise gut genug für Ihren Zweck, wenn Sie auf einem älteren Python ohne Ast arbeiten.
quelle
eval
ist gefährlich - Sie sollten keine Benutzereingaben ausführen." Ich benutze 3.6eval
direkt verwenden, wird jeder gültige Python-Ausdruck ausgewertet, der möglicherweise gefährlich ist.literal_eval
Löst dieses Problem, indem nur Python-Literalstrukturen ausgewertet werden: Zeichenfolgen, Zahlen, Tupel, Listen, Diktate, Boolesche Werte und Keine.quelle
Es gibt eine schnelle Lösung:
Unerwünschte Leerzeichen in den Listenelementen können auf folgende Weise entfernt werden:
quelle
Inspiriert von einigen der obigen Antworten, die mit Basis-Python-Paketen funktionieren, habe ich die Leistung einiger weniger verglichen (mit Python 3.7.3):
Methode 1: ast
Methode 2: json
Methode 3: kein Import
Ich war enttäuscht zu sehen, dass die Methode mit der schlechtesten Lesbarkeit die Methode mit der besten Leistung war. Bei der am besten lesbaren Option sind Kompromisse zu berücksichtigen. Für die Art der Workloads, für die ich normalerweise Python verwende Wert Lesbarkeit über eine etwas leistungsfähigere Option, aber wie üblich hängt es davon ab.
quelle
Wenn es sich nur um eine eindimensionale Liste handelt, können Sie dies tun, ohne etwas zu importieren:
quelle
Angenommen, alle Ihre Eingaben sind Listen und die doppelten Anführungszeichen in der Eingabe spielen keine Rolle, kann dies durch einfaches Ersetzen von regulären Ausdrücken erfolgen. Es ist ein bisschen perl-y, funktioniert aber wie ein Zauber. Beachten Sie auch, dass die Ausgabe jetzt eine Liste von Unicode-Zeichenfolgen ist. Sie haben nicht angegeben, dass Sie dies benötigen, aber es scheint angesichts der Unicode-Eingabe sinnvoll zu sein.
Die Junkers-Variable enthält einen kompilierten regulären Ausdruck (für die Geschwindigkeit) aller Zeichen, die wir nicht wollen, wobei] als Zeichen einige Backslash-Tricks erfordert. Das re.sub ersetzt alle diese Zeichen durch nichts, und wir teilen die resultierende Zeichenfolge durch Kommas auf.
Beachten Sie, dass dadurch auch Leerzeichen aus den Einträgen u '["oh nein"]' ---> [u'ohno '] entfernt werden. Wenn dies nicht das ist, was Sie wollten, muss der reguläre Ausdruck etwas aufgemotzt werden.
quelle
Wenn Sie wissen, dass Ihre Listen nur Zeichenfolgen in Anführungszeichen enthalten, erhalten Sie in diesem Pyparsing-Beispiel eine Liste der entfernten Zeichenfolgen (wobei sogar die ursprüngliche Unicode-Ness erhalten bleibt).
Wenn Ihre Listen mehr Datentypen haben können oder sogar Listen in Listen enthalten, benötigen Sie eine vollständigere Grammatik - wie diese im Pyparsing-Wiki, die Tupel, Listen, Ints, Floats und Zeichenfolgen in Anführungszeichen verarbeitet. Funktioniert mit Python-Versionen bis 2.4.
quelle
parsePythonValue.py
Beispiel ist jetzt auf GitHub unter github.com/pyparsing/pyparsing/blob/master/examples/…Um die Antwort von @Ryan mit json weiter zu vervollständigen, ist eine sehr praktische Funktion zum Konvertieren von Unicode die hier veröffentlichte: https://stackoverflow.com/a/13105359/7599285
Ex mit doppelten oder einfachen Anführungszeichen:
quelle
Ich möchte eine intuitivere Musterlösung mit Regex anbieten. Die folgende Funktion verwendet als Eingabe eine String-Liste, die beliebige Strings enthält.
Schrittweise Erklärung: Sie entfernen alle Leerzeichen, Klammern und Werttrennzeichen (vorausgesetzt, sie sind nicht Teil der Werte, die Sie extrahieren möchten, andernfalls wird der reguläre Ausdruck komplexer). Dann teilen Sie die bereinigte Zeichenfolge in einfache oder doppelte Anführungszeichen und nehmen die nicht leeren Werte (oder ungerade indizierte Werte, unabhängig von der Präferenz).
Testbeispiel : "['21'," foo "'6', '0'," A "]"
quelle
und mit reinem Python - keine Bibliotheken importieren
quelle
Möglicherweise treten solche Probleme auf, wenn Sie mit als Pandas DataFrame gespeicherten Daten arbeiten.
Diese Lösung funktioniert wie ein Zauber, wenn die Werteliste als Text vorliegt .
quelle
Nach all den Antworten entschied ich mich, die gängigsten Methoden zu bestimmen:
Am Ende gewinnt also Regex!
quelle
Sie können sich den .strip () fcn sparen, indem Sie einfach das erste und das letzte Zeichen aus der Zeichenfolgendarstellung der Liste entfernen (siehe dritte Zeile unten).
quelle