1183 Stimmen

Eine String-Darstellung eines Wörterbuchs in ein Wörterbuch umwandeln?

Wie kann ich die str Darstellung einer dict wie etwa die folgende Zeichenkette, in eine dict ?

s = "{'muffin' : 'lolz', 'foo' : 'kitty'}"

Ich ziehe es vor, nicht zu verwenden eval . Was kann ich noch verwenden?

Der Hauptgrund dafür ist, dass eine Klasse, die ein Kollege von mir geschrieben hat, alle Eingaben in Strings umwandelt. Ich bin nicht in der Stimmung zu gehen und seine Klassen zu ändern, um mit diesem Problem umzugehen.

2 Stimmen

Wenn Sie Python 2.6 nicht verwenden können, können Sie eine einfache safeeval-Implentation verwenden wie code.activestate.com/rezepte/364469 Es setzt auf den Python-Compiler auf, so dass Sie nicht selbst die ganze Arbeit machen müssen.

30 Stimmen

Hinweis : Für diejenigen, die hierher kommen mit täuschend ähnlich aussehend JSON Daten, wollen Sie lesen gehen JSON in Python parsen stattdessen. JSON ist nicht dasselbe wie Python . Wenn Sie " doppelte Anführungszeichen um Ihre Zeichenketten haben Sie wahrscheinlich JSON-Daten. Sie können auch nach null , true o false Die Python-Syntax verwendet None , True y False .

25voto

Blixt Punkte 48333

Wenn die Zeichenfolge immer vertrauenswürdig sind, könnten Sie eval (oder verwenden Sie literal_eval wie vorgeschlagen; es ist sicher, egal wie die Zeichenfolge lautet). Ansonsten brauchen Sie einen Parser. Ein JSON-Parser (wie simplejson) würde funktionieren, wenn er nur Inhalte speichert, die in das JSON-Schema passen.

9 Stimmen

Ab Version 2.6 ist simplejson in der Python-Standardbibliothek als json-Modul enthalten.

12 Stimmen

Ja, das ist eine gute Antwort, aber beachten Sie, dass offiziell JSON nicht unterstützt Single-Quoted-Strings, wie in der ursprünglichen Posters Beispiel gegeben.

20voto

Rogerio Silveira Punkte 225

使用方法 json . die ast Bibliothek verbraucht viel Speicherplatz und ist langsamer. Ich habe einen Prozess, der eine Textdatei von 156Mb lesen muss. Ast mit 5 Minuten Verzögerung für das Konvertierungswörterbuch json und 1 Minute mit 60 % weniger Speicherplatz!

15 Stimmen

Hat aber seine Grenzen: Versuchen Sie, die Zeichenkette "{'foo':'bar',}" zu konvertieren.

11voto

string = "{'server1':'value','server2':'value'}"

#Now removing { and }
s = string.replace("{" ,"")
finalstring = s.replace("}" , "")

#Splitting the string based on , we get key value pairs
list = finalstring.split(",")

dictionary ={}
for i in list:
    #Get Key Value pairs separately to store in dictionary
    keyvalue = i.split(":")

    #Replacing the single quotes in the leading.
    m= keyvalue[0].strip('\'')
    m = m.replace("\"", "")
    dictionary[m] = keyvalue[1].strip('"\'')

print dictionary

3 Stimmen

Bei diesem Ansatz gibt es viele Fehler. Was, wenn der Wert eines Schlüssels Folgendes enthält { o } . Was ist, wenn sie verschachtelt ist? dict . Was ist, wenn der Wert , ??

7voto

tsuresh97 Punkte 426

Optimierter Code von Siva Kameswara Rao Munipalle

s = s.replace("{", "").replace("}", "").split(",")

dictionary = {}

for i in s:
    dictionary[i.split(":")[0].strip('\'').replace("\"", "")] = i.split(":")[1].strip('"\'')

print(dictionary)

6voto

tamerlaha Punkte 1688

Es werden keine Bibliotheken verwendet (Python2):

dict_format_string = "{'1':'one', '2' : 'two'}"
d = {}
elems  = filter(str.isalnum,dict_format_string.split("'"))
values = elems[1::2]
keys   = elems[0::2]
d.update(zip(keys,values))

HINWEIS: Da es fest kodiert ist split("'") funktioniert nur bei Zeichenketten, bei denen die Daten in "einfachen Anführungszeichen" stehen.

HINWEIS2: In Python3 müssen Sie die filter() a list() um die Liste zu erhalten.

0 Stimmen

Elems = filter(str.isalnum,dict_format_string.split("'")) sollte list(elems = filter(str.isalnum,dict_format_string.split("'"))) sein, ohne Umwandlung in eine Liste wäre es immer noch ein 'filter' Objekt

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X