2017-08-23 4 views
0

J'ai un peu de mal à comprendre l'ordre des opérations pour convertir mes tuples en json. Voici ma liste:Convertir des tuples python en coordonnées Google Maps json

coordinates = [(45.62, -122.23),(45.63, -122.22),(45.64, -122.21)] 

Lors de l'exécution par mon code:

coordinates = [(45.62, -122.23),(45.63, -122.22),(45.64, -122.21)]  
coordinatesList = json.dumps(dict(coordinates)) 

je parviens à obtenir un seul tableau JSON. Voici ma sortie actuelle:

print(coordinatesList) 

{"45.62": -122.23, "45.63": -122.22, "45.64": -122.21} 

Comme vous pouvez le voir, j'ai de nombreux problèmes ici. Certaines coordonnées sont encapsulées avec des guillemets alors que les secondes ne le sont pas. J'ai également besoin d'ajouter les valeurs avec "lat" et "lng" pour adapter Google Maps API, mais je suis confus quant à l'endroit dans le contrôle de flux pour le faire.

Voici ma sortie désirée:

 [ 
      {lat: 45.62, lng: -122.23}, 
      {lat: 45.63, lng: -122.22}, 
      {lat: 45.64, lng: -122.21}, 
     ] 

Répondre

1

clés JSON doivent être une chaîne, donc entre guillemets.

Vous pouvez réorganiser vos données en utilisant une compréhension de la liste pour générer la liste des dicts avec les touches appropriées et si vous voulez supprimer les guillemets, il suffit d'utiliser str.replace

import json 

coordinates = [(45.62, -122.23),(45.63, -122.22),(45.64, -122.21)] 

result = json.dumps([{"lat":x[0],"lng":x[1]} for x in coordinates],indent=2).replace('"',"") 

qui me donne (grâce à prettying indent paramètre):

[ 
    { 
    lat: 45.62, 
    lng: -122.23 
    }, 
    { 
    lat: 45.63, 
    lng: -122.22 
    }, 
    { 
    lat: 45.64, 
    lng: -122.21 
    } 
] 

dans ce cas simple, vous avez plus de contrôle sans json en utilisant seulement str.format et str.join:

result = "[\n{}\n]".format(",\n".join(" {{lat: {},lng: {}}}".format(*x) for x in coordinates)) 

Résultat:

[ 
    {lat: 45.62,lng: -122.23}, 
    {lat: 45.63,lng: -122.22}, 
    {lat: 45.64,lng: -122.21} 
] 

EDIT: si votre entrée est en fait une chaîne :

coordinates = "[(45.62, -122.23),(45.63, -122.22),(45.64, -122.21)]" 

vous pouvez utiliser ast.literal_eval pour évaluer en toute sécurité à une liste de python de tuples:

import ast 
coordinates = ast.literal_eval(coordinates) 

et le code ci-dessus s'applique.

+0

résultat = "[\ n {} \ n]" Format ("\ n" .join (»{{lat. : {}, lng: {}}} ". format (* x) pour x dans les coordonnées)) IndexError: index de tuple hors échelle Vous obtenez cette erreur? – Hikalea

+0

pas avec les exemples de données que vous avez fournis et que j'ai collés. se produit si l'un des tuples n'a qu'une valeur. –

+0

Ah la liste des coordonnées est actuellement stockée sous forme de chaîne, comme les coordonnées = "[(45.62, -122.23), (45.63, -122.22)". Comment pourrais-je le convertir en littéral pour que votre solution fonctionne? – Hikalea

0

Itérer dans la liste des paires de coordonnées et de les convertir en JSON:

coordinates = [(45.62, -122.23),(45.63, -122.22),(45.64, -122.21)] 
coord_list = [] 
for coord_pair in coordinates: 
    json_coord_pair = {} 
    json_coord_pair["lat"] = str(coord_pair[0]) 
    json_coord_pair["lng"] = str(coord_pair[1]) 
    json_coord_pair = json.dumps(json_coord_pair) 
    coord_list.append(json_coord_pair) 
+0

json_coord_pair ["lng"] = str (coord_pair [1]) IndexError: indice de chaîne hors plage ? – Hikalea

+0

essayez de copier et coller mon exemple. Je viens de le faire et ça fonctionne. – AllenMoh