Python Konvertieren von string zu dict
Ich habe einen string :
'{tomatoes : 5 , livestock :{cow : 5 , sheep :2 }}'
und möchte konvertieren
{
"tomatoes" : "5" ,
"livestock" :"{"cow" : "5" , "sheep" :"2" }"
}
Irgendwelche Ideen ?
- Gibt es einen Grund, warum Sie wollen, dass die zahlen erfasst werden als strings?
- Nicht unbedingt , ich dachte, es könnte einfacher sein, dass Art und Weise.
- Das ist eine Art paradox. Sie können nicht wirklich ändern, einen string in ein dictionary-Typ... Es ist nicht so, können Sie ändern Sie den Typ auf einem
dict
. Das ist ziemlich interessant, würde ich mag, um herauszufinden, wie diese spielt sich... JSON ist eine nützliche Möglichkeit, es zu tun, aber wie wäre es mit einem brute-force hard code Weg? - Das ist ein unheimlich formatiert Wörterbuch. Wo kam es aus?
- Dieser stammt aus einer Mac-app. Brauche ich für die Konvertierung in eine echte python-dict für einen schnelleren Zugriff.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wurde dies ließ sich in Neun hundert acht und achtzig tausend zwei hundert eins und fünfzig
Kurz gesagt; mit der python -
ast
Bibliothekliteral_eval()
Funktion.Was u haben, ist eine JSON-formatierte Zeichenkette, die u wollen, zu konvertieren zu einem python-dictionary.
Nutzung der JSON-Bibliothek :
Nun das Wörterbuch enthält die Daten-Struktur, die ur suchen.
Sich das problem mit dem input-string ist, dass es eigentlich nicht um einen gültigen JSON-weil Sie Ihre Schlüssel nicht deklariert als String, ansonsten können Sie nur verwenden, die
json
Modul zu laden und mit ihm getan werden.Eine einfache und schmutzige Art und Weise zu bekommen, was Sie wollen, ist, drehen Sie diese zuerst in ein gültiges JSON-durch das hinzufügen von Anführungszeichen um alles, was nicht für ein Leerzeichen oder ein syntax-Charakter:
Dieser gibt Ihnen eine gültige JSON-so, jetzt können Sie ganz einfach analysieren, um ein Python -
dict
mit derjson
Modul:parsed = eval(output)
?eval
. Und auch die wahnsinnigen, sollten zweimal überlegen, bevor Sie es... und verwenden Sie dannast.literal_eval()
statt, wenn Sie wirklich nicht finden keine Möglichkeit um ihn herum. Außer, es ist viel langsamer alsjson.loads()
sowieso.eval
unddangerous
,bad practice
,slow
und wie hier auf SO und du wirst mehr bekommen, als ein Schluck von Gründen, warum sollten Sie es nicht verwenden. Kurz gesagt - in 99,999% der möglichen Anwendungsfälle gibt es eine schnellere, bessere und sicherere Lösung, ohne dass Sie Ihr system, um die Gefahren des Laufenden beliebigen code miteval()
.'{tomatoes: 5, livestock: {cow: 5, sheep: 2}}'
.eval()
je berühren beliebigen Zeichenfolgen (die ist, warum die meisten Menschen verwenden möchteneval()
sowieso).Hier ist meine Antwort:
Meine Strategie ist, zu konvertieren Wörterbuch
str
zu einemdict
durcheval
. Allerdings habe ich zunächst mit der Tatsache auseinandersetzen, dass Ihre Schlüssel für Wörterbücher sind nicht in Anführungszeichen eingeschlossen ist. Ich tun, dass durch die Auswertung das überhaupt ist und fangen Sie den Fehler. Aus der Fehlermeldung, die ich entpacken Sie die Taste, die wurde interpretiert, wie eine unbekannte variable, und schließen Sie ihn in Anführungszeichen.eval
sind, Bedenken Sie, es gibt eine Funktion in derast
Modul namensliteral_eval
, die hat auch einen deutlich geringeren Spielraum für die Bewertung und somit sicherer ist.