2009-04-03 5 views
31

En python, j'ai un dictionnaire qui mappe des tuples à une liste de tuples. par exemple.Meilleure façon d'encoder des tuples avec json

{(1,2): [(2,3),(1,7)]}

Je veux être en mesure d'encoder ces données utilisent avec javascript, alors j'ai regardé en JSON, mais il semble les clés doivent être des chaînes si mon tuple ne fonctionne pas comme une clé.

Est-ce que le meilleur moyen de gérer cela est de l'encoder en "1,2" et de l'analyser en quelque chose que je veux sur le javascript? Ou y a-t-il une manière plus intelligente de gérer cela?

Répondre

19

Vous pourriez envisager de dire

{"[1,2]": [(2,3),(1,7)]} 

et puis quand vous avez besoin pour obtenir la valeur, vous pouvez simplement analyser les mêmes clés comme des objets JSON, que tous les navigateurs modernes peuvent faire avec le JSON.parse intégré méthode (J'utilise jQuery.each pour itérer ici, mais vous pouvez utiliser quoi que ce soit):

var myjson = JSON.parse('{"[1,2]": [[2,3],[1,7]]}'); 
$.each(myjson, function(keystr,val){ 
    var key = JSON.parse(keystr); 
    // do something with key and val 
}); 

d'autre part, vous pourriez vouloir structurer simplement votre objet différemment, par exemple

{1: {2: [(2,3),(1,7)]}} 

de sorte qu'au lieu de dire

myjson[1,2] // doesn't work 

qui est invalide syntaxe Javascript, on pourrait dire

myjson[1][2] // returns [[2,3],[1,7]] 
+1

Merci pour l'idée des dictionnaires imbriqués! Je n'aurais pas pensé à ça. Je ne sais pas quelle approche fonctionnera le mieux pour moi, mais cela me semble être une bonne idée, merci! – f4hy

0

Serait-ce simplement un réseau bidimensionnel? Ensuite, vous pouvez utiliser des entiers comme clés

+0

deux tableaux dimensionnels sont maladroits dans python, sinon cela peut fonctionner. – f4hy

2

Ma recommandation serait:

{ "1": [ 
     { "2": [[2,3],[1,7]] } 
     ] 
} 

Il est encore l'analyse syntaxique, mais en fonction de la façon dont vous l'utilisez, il peut être plus facile sous cette forme.

1

Vous ne pouvez pas utiliser un tableau en tant que clé dans JSON. Le mieux que vous pouvez faire est de l'encoder. Désolé, mais il n'y a vraiment aucune autre façon de le faire.

7

Si vos tuples clés sont vraiment paires entières, le plus facile et probablement le plus approche directe serait comme vous le suggérez .... les encoder à une chaîne. Vous pouvez le faire dans un one-liner:

>>> simplejson.dumps(dict([("%d,%d" % k, v) for k, v in d.items()])) 
'{"1,2": [[2, 3], [1, 7]]}' 

Cela vous obtenir une structure de données javascript dont les clés que vous pouvez ensuite diviser pour obtenir les points de retour:

'1,2'.split(',') 
+0

Merci pour l'édition nosklo ... tout le monde a besoin d'un bon éditeur :-) –

+0

Cool. Merci pour les exemples de code aussi! – f4hy

+0

Pour cet exemple spécifique, tuple ('1,2'.split (', ')). Et si l'exemple de la question est The Norm, on voudrait tuple (int (s) pour s dans '1,2'.split (', '))). – pythonlarry

Questions connexes