¿Cómo crear un diccionario Python con comillas dobles como formato de cita predeterminado?


Estoy tratando de crear un diccionario python que se utilizará como un var de script java dentro de un archivo html para fines de visualización. Como requisito, necesito crear el diccionario con todos los nombres dentro de comillas dobles en lugar de comillas simples predeterminadas que usa Python. ¿Hay una manera fácil y elegante de lograr esto.

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

Salida Generada:

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

Producción prevista:

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

Sé, json.dumps(pairs) hace el trabajo, pero el diccionario como un todo se convierte en una cuerda que no es lo que estoy esperando.

P.d.: Hay una forma alternativa de hacer esto con el uso de json, ya que estoy tratando con diccionarios anidados.

Author: Shankar, 2013-08-17

6 answers

Puedes construir tu propia versión de un dict con impresión especial usando 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"}

También puedes iterar:

>>> for el in pairs:
       print el

arun
bill
jack
hari
 24
Author: elyase,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-11 12:46:31

json.dumps() es lo que quieres aquí, si utilizas print json.dumps(pairs) obtendrás la salida esperada:

>>> 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"}
 40
Author: Andrew Clark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-17 00:02:27

Aquí hay una versión básica print:

>>> print '{%s}' % ', '.join(['"%s": "%s"' % (k, v) for k, v in pairs.items()])
{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}
 3
Author: Brent Washburne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-17 00:10:35
# 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

Rinde:

{"arun": "maya", "bill": "samantha", "jack": "ilena", "hari": "aradhana"}
 2
Author: Russell Borogove,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-17 00:27:19

La premisa de la pregunta es errónea:

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.

Debería estar esperando una conversión a una cadena. Todo lo que "print" hace es convertir un objeto en una cadena y enviarlo a la salida estándar.

Cuando Python ve:

print somedict

Lo que realmente hace es:

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

Como puede ver, el dict siempre se convierte en una cadena (después de todo, una cadena es el único tipo de datos que puede enviar a un archivo como stdout).

Se puede controlar la conversión a una cadena ya sea definiendo _ _ str_ _ para un objeto (como lo han hecho los otros encuestados) o llamando a una función de impresión bonita como json.dumps(). Aunque ambas formas tienen el mismo efecto de crear una cadena a imprimir, esta última técnica tiene muchas ventajas (no es necesario crear un nuevo objeto, se aplica recursivamente a datos anidados, es estándar, está escrito en C para velocidad, y ya está bien probado).

El postscript todavía pierde el punto:

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

¿Por qué trabajar tan duro para ¿evitar el módulo json? Prácticamente cualquier solución al problema de imprimir diccionarios anidados con comillas dobles reinventará lo que json.dumps () ya lo hace.

 2
Author: Raymond Hettinger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-12 15:56:36

El problema que me ha llegado varias veces es al cargar un archivo json.

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)

Accidentalmente paso datos a alguna función que quiere una cadena json y obtengo el error que comilla simple no es json válido. Reviso el archivo json de entrada y veo las comillas dobles y luego me rasco la cabeza por un minuto.

El problema es que data es un dict, no una cadena, pero cuando Python lo convierte por ti NO es un json válido.

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

Si el json es válido y el dict no necesita procesamiento antes de la conversión a cadena, simplemente cargue como cadena hace el truco.

with open('json_test.json', 'r') as f:
    json_string = f.read()
    print(json_string)
 1
Author: shao.lo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-07 21:46:41