104 votes

Comment créer un dictionnaire Python avec des guillemets doubles comme format de citation par défaut ?

J'essaie de créer un dictionnaire python qui doit être utilisé comme un script java var à l'intérieur d'un fichier html à des fins de visualisation. J'ai besoin de créer le dictionnaire avec tous les noms entre guillemets doubles au lieu des guillemets simples par défaut que Python utilise. Existe-t-il un moyen simple et élégant d'y parvenir ?

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

Sortie générée :

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

Résultats attendus :

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

Je sais, json.dumps(pairs) fait le travail, mais le dictionnaire dans son ensemble est converti en une chaîne de caractères, ce qui n'est pas ce que j'attends.

P.S. : Existe-t-il une autre façon de procéder en utilisant json, étant donné que j'ai affaire à des dictionnaires imbriqués ?

87voto

Andrew Clark Points 77748

json.dumps() est ce que vous voulez ici, si vous utilisez print json.dumps(pairs) vous obtiendrez le résultat attendu :

>>> 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"}

73voto

elyase Points 5098

Vous pouvez construire votre propre version d'un dict avec une impression spéciale en utilisant 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"}

Vous pouvez également itérer :

>>> for el in pairs:
       print el

arun
bill
jack
hari

12voto

Russell Borogove Points 8423
# 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

Rendement :

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

8voto

Brent Washburne Points 2453

Voici un exemple de base print version :

>>> print '{%s}' % ', '.join(['"%s": "%s"' % (k, v) for k, v in pairs.items()])
{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}

5voto

Raymond Hettinger Points 231

La prémisse de la question est fausse :

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.

Vous devriez vous attendre à une conversion en chaîne de caractères. Tout ce que fait "print" est de convertir un objet en chaîne de caractères et de l'envoyer à la sortie standard.

Quand Python voit :

print somedict

Ce qu'il fait vraiment :

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

Comme vous pouvez le constater, le dict est toujours converti en chaîne de caractères (après tout, une chaîne de caractères est le seul type de données que vous pouvez envoyer à un fichier tel que stdout ).

Le contrôle de la conversion en chaîne de caractères peut se faire soit en définissant __str__ pour un objet (comme l'ont fait les autres répondants), soit en appelant une jolie fonction d'impression telle que json.dumps() . Bien que les deux méthodes aient le même effet de créer une chaîne de caractères à imprimer, la dernière technique présente de nombreux avantages (il n'est pas nécessaire de créer un nouvel objet, elle s'applique récursivement aux données imbriquées, elle est standard, elle est écrite en C pour la rapidité, et elle est déjà bien testée).

Le post-scriptum ne répond toujours pas à la question :

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

Pourquoi travailler si dur pour éviter le json module ? Presque toutes les solutions au problème de l'impression de dictionnaires imbriqués avec des guillemets doubles réinventent ce que l'on appelle le "module". json.dumps() le fait déjà.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X