Wie erstelle ich ein Python-Wörterbuch mit doppelten Anführungszeichen als Standard-Anführungszeichenformat?

75

Ich versuche, ein Python-Wörterbuch zu erstellen, das als Java-Skript var in einer HTML-Datei zu Visualisierungszwecken verwendet werden soll. Als Voraussetzung muss das Wörterbuch mit allen Namen in doppelten Anführungszeichen anstelle der von Python verwendeten Standard-Anführungszeichen erstellt werden. Gibt es eine einfache und elegante Möglichkeit, dies zu erreichen?

    couples = [
               ['jack', 'ilena'], 
               ['arun', 'maya'], 
               ['hari', 'aradhana'], 
               ['bill', 'samantha']]
    pairs = dict(couples)
    print pairs

Generierte Ausgabe:

{'arun': 'maya', 'bill': 'samantha', 'jack': 'ilena', 'hari': 'aradhana'}

Erwartete Ausgabe:

{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}

Ich weiß, json.dumps(pairs)macht den Job, aber das Wörterbuch als Ganzes wird in eine Zeichenfolge konvertiert, die nicht das ist, was ich erwarte.

PS: Gibt es eine alternative Möglichkeit, dies mit json zu tun, da es sich um verschachtelte Wörterbücher handelt?

Shankar
quelle
5
Wenn Sie zum Drucken eines Wörterbuchs auffordern, drucken Sie die Konvertierung des Wörterbuchs in eine Zeichenfolge trotzdem, sodass JSON völlig angemessen ist - insbesondere, wenn Sie versuchen, mit Javascript zu wechseln.
Russell Borogove
9
Sie ändern nichts am Wörterbuch. Sie erstellen eine Zeichenfolgendarstellung davon. Das Wörterbuch enthält keine einfachen Anführungszeichen. Es enthält Zeichenfolgen. Sie sind verwirrt darüber, was ein Wörterbuch ist.
Russell Borogove
1
@RussellBorogove: Oder grundlegender verwirrt über den Unterschied zwischen einem tatsächlichen Zeichenfolgenobjekt und seiner Darstellung.
abarnert
1
@ArunprasathShankar Sie müssen erklären, warum Sie denken, doppelte Anführungszeichen als Standard zu verwenden, ist Ihre einzige Option. Die Konvertierung in JSON schließt weitere Updates nicht aus. Sie können jederzeit wieder in JSON konvertieren, wenn weitere Updates vorhanden sind, oder?
Jon-Eric
1
Die Frage scheint grundsätzlich falsch. Das Schlüsselwort "print" ruft __str__ im Wörterbuch auf und konvertiert in eine Zeichenfolge, genau wie dies der json.dumps(pairs)Fall ist. Das OP zeigt ein grundlegendes Missverständnis, das er / sie sagte "aber das Wörterbuch als Ganzes wird in eine Zeichenfolge umgewandelt, die nicht das ist, was ich erwarte." Wenn Sie ein Objekt drucken, wird das Objekt unabhängig davon, wie Sie es drucken, zunächst in eine Zeichenfolge konvertiert.
Raymond Hettinger

Antworten:

55

Sie können Ihre eigene Version eines Diktats mit Spezialdruck erstellen, indem Sie Folgendes verwenden json.dumps():

>>> import json
>>> class mydict(dict):
        def __str__(self):
            return json.dumps(self)

>>> couples = [['jack', 'ilena'], 
               ['arun', 'maya'], 
               ['hari', 'aradhana'], 
               ['bill', 'samantha']]    

>>> pairs =  mydict(couples) 
>>> print pairs
{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}

Sie können auch iterieren:

>>> for el in pairs:
       print el

arun
bill
jack
hari
Elyase
quelle
4
Dies funktioniert nicht, wenn einige Ihrer Diktatwerte Bools sind und Sie die resultierende Zeichenfolge in einem anderen Kontext verwenden möchten, in dem sie als Python-Code ausgewertet wird.
Akhomenko
65

json.dumps()ist das, was Sie hier wollen, wenn Sie verwenden, erhalten print json.dumps(pairs)Sie Ihre erwartete Ausgabe:

>>> pairs = {'arun': 'maya', 'bill': 'samantha', 'jack': 'ilena', 'hari': 'aradhana'}
>>> print pairs
{'arun': 'maya', 'bill': 'samantha', 'jack': 'ilena', 'hari': 'aradhana'}
>>> import json
>>> print json.dumps(pairs)
{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}
Andrew Clark
quelle
1
Ich suche nach einer alternativen Option, bei der ich die doppelten Anführungszeichen als Standardoption für Python-Wörterbücher erzwingen kann.
Shankar
1
@FJ: Im zweiten Fall gibt json.dumps (Paare) einen String zurück. Was ist, wenn ich eine dictTypobjektausgabe möchte, in der die Zeichenfolgenschlüssel in doppelten Anführungszeichen stehen?
Pranjal Mittal
5
json.dumpswird das Wörterbuch in einen String konvertieren, obwohl es mit doppelten Anführungszeichen gut aussieht, type(json.dumps(pairs))ist ein String, ich glaube nicht, dass dies das ist, was OP erwartet
Penny Chan
7
# do not use this until you understand it
import json

class doubleQuoteDict(dict):
    def __str__(self):
        return json.dumps(self)

    def __repr__(self):
        return json.dumps(self)

couples = [
           ['jack', 'ilena'], 
           ['arun', 'maya'], 
           ['hari', 'aradhana'], 
           ['bill', 'samantha']]
pairs = doubleQuoteDict(couples)
print pairs

Ausbeuten:

{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}
Russell Borogove
quelle
Dies ist die Antwort, die als richtig akzeptiert werden sollte.
Sidon
@ Sidon Ich stimme dem zu.
Oldboy
6

Hier ist eine Basisversion print:

>>> print '{%s}' % ', '.join(['"%s": "%s"' % (k, v) for k, v in pairs.items()])
{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}
Brent Washburne
quelle
Die Lösung eignet sich gut zum Drucken. Was ist, wenn ich das Wörterbuch nach einer Angebotsänderung weiter aktualisieren oder iterieren muss?
Shankar
3
Aktualisieren Sie die pairsund führen Sie diese Zeile erneut aus.
Brent Washburne
4

Die Prämisse der Frage ist falsch:

I know, json.dumps(pairs) does the job, but the dictionary 
as a whole is converted into a string which isn't what I am expecting.

Sie sollten eine Konvertierung in eine Zeichenfolge erwarten. Alles, was "print" tut, ist, ein Objekt in eine Zeichenfolge zu konvertieren und es an die Standardausgabe zu senden.

Wenn Python sieht:

print somedict

Was es wirklich tut, ist:

sys.stdout.write(somedict.__str__())
sys.stdout.write('\n')

Wie Sie sehen, wird das Diktat immer in eine Zeichenfolge konvertiert (schließlich ist eine Zeichenfolge der einzige Datentyp, den Sie an eine Datei wie stdout senden können ).

Die Steuerung der Konvertierung in eine Zeichenfolge kann entweder durch Definieren von __str__ für ein Objekt (wie es die anderen Befragten getan haben) oder durch Aufrufen einer hübschen Druckfunktion wie z json.dumps(). Obwohl beide Methoden den gleichen Effekt beim Erstellen einer zu druckenden Zeichenfolge haben, bietet die letztere Technik viele Vorteile (Sie müssen kein neues Objekt erstellen, sie gilt rekursiv für verschachtelte Daten, sie ist Standard, sie ist in C für geschrieben Geschwindigkeit, und es ist bereits gut getestet).

Das Postskriptum verfehlt immer noch den Punkt:

P.S.: Is there an alternate way to do this with using json, since I am
dealing with nested dictionaries.

Warum so hart arbeiten, um das JSON- Modul zu vermeiden ? So gut wie jede Lösung für das Problem des Druckens verschachtelter Wörterbücher mit doppelten Anführungszeichen wird neu erfinden, was json.dumps () bereits tut.

Raymond Hettinger
quelle
1

Das Problem, das mich mehrfach beschäftigt hat, ist beim Laden einer JSON-Datei.

import json
with open('json_test.json', 'r') as f:
    data = json.load(f)
    print(type(data), data)
    json_string = json.dumps(data)
    print(json_string)

Ich übergebe versehentlich Daten an eine Funktion, die eine JSON-Zeichenfolge möchte, und erhalte die Fehlermeldung, dass ein einfaches Anführungszeichen nicht gültig ist. Ich überprüfe die Eingabe-JSON-Datei erneut und sehe die doppelten Anführungszeichen. Dann kratzte ich mir eine Minute am Kopf.

Das Problem ist, dass Daten ein Diktat und keine Zeichenfolge sind, aber wenn Python sie für Sie konvertiert, ist sie NICHT gültig.

<class 'dict'> {'bill': 'samantha', 'jack': 'ilena', 'hari': 'aradhana', 'arun': 'maya'}
{"bill": "samantha", "jack": "ilena", "hari": "aradhana", "arun": "maya"}

Wenn der JSON gültig ist und das Diktat vor der Konvertierung in einen String nicht verarbeitet werden muss, laden Sie ihn einfach, während der String den Trick ausführt.

with open('json_test.json', 'r') as f:
    json_string = f.read()
    print(json_string)
shao.lo
quelle
0

Es ist einfach, nur 2 Schritte

step1:converting your dict to list

step2:iterate your list and convert as json .

Zum besseren Verständnis überprüfen Sie unten das Snippet

import json
couples = [
               ['jack', 'ilena'], 
               ['arun', 'maya'], 
               ['hari', 'aradhana'], 
               ['bill', 'samantha']]
pairs = [dict(couples)]#converting your dict to list
print(pairs)

#iterate ur list and convert as json
for x in pairs:
    print("\n after converting: \n\t",json.dumps(x))#json like structure
William James
quelle