2012-09-09 18 views
10

Estoy escribiendo un pequeño programa en python y estoy usando un diccionario cuyas claves y valores (como el título dice) son tuplas. Estoy tratando de utilizar JSON de la siguiente maneraDiccionario de ahorro cuyas claves son tuplas con json, python

import json 
data = {(1,2,3):(a,b,c),(2,6,3):(6,3,2)} 
print json.dumps(data) 

problema es que siguen dando TypeError: keys must be a string.

¿Cómo puedo hacerlo? Intenté mirar la documentación de Python pero no vi ninguna solución clara. ¡Gracias!

+5

Pero el formato JSON requiere que las claves sean cadenas ... – kennytm

+0

¿Puedo analizarlo como una cadena entonces? – Yotam

+0

¿Por qué necesita tuplas como claves? – seriousdev

Respuesta

12

Tendrá que convertir sus tuplas de cadenas en primer lugar:

json.dumps({str(k): v for k, v in data.iteritems()}) 

Por supuesto, usted va a terminar con cadenas en lugar de tuplas para las llaves:

'{"(1, 2, 3)": ["a", "b", "c"], "(2, 6, 3)": [6, 3, 2]}' 
+0

Sería interesante saber cómo revertir esta acción. –

+3

@RickyRobinson: 'ast.literal_eval()' reconstituirá el valor de Python de la cadena. –

+1

Esto funcionó para mí en python3: converted = {ast.literal_eval (k): v para k, v en json.items()} – Johan

5

Si desea carga tus datos más tarde, tienes que postprocesar de todos modos. Por lo tanto, que acababa de volcar data.items():

>>> import json 
>>> a, b, c = "abc" 
>>> data = {(1,2,3):(a,b,c), (2,6,3):(6,3,2)} 
>>> on_disk = json.dumps(data.items()) 
>>> on_disk 
'[[[2, 6, 3], [6, 3, 2]], [[1, 2, 3], ["a", "b", "c"]]]' 
>>> data_restored = dict(map(tuple, kv) for kv in json.loads(on_disk)) 
>>> data_restored 
{(2, 6, 3): (6, 3, 2), (1, 2, 3): (u'a', u'b', u'c')} 
0

Para Python 3 * usuarios: , además de la respuesta @Martijn Pieters,

dictonary.iteritems() no es válida, reemplazarlo con dictionary.items():

json.dumps({str(k): v for k, v in data.items()}) 
0

Puede usar el módulo ujson. ujson.dumps() acepta tuplas como claves en un diccionario. Puede instalar ujson por pip.

Cuestiones relacionadas