2010-08-08 13 views
0

J'ai beaucoup lu dans ce forum, mais je ne pouvais pas trouver un moyen correct d'ajouter tous les éléments à mon dictionnaire ... Alors peut-être que quelqu'un peut m'aider! d'abord une explication:ajouter un élément au dictionnaire

rows = cur.fetchall() 
columns=[desc[0] for desc in cur.description] 
GID_Distances = {} 
if len(rows) > 0: 
    for row in rows: 
     items = zip(columns, row) 
     GID_Distances = {} 
     for (name, value) in items: 
     GID_Distances[name]=value 

lignes est une liste d'une instruction SQL. donc dans cette liste sont plusieurs valeurs avec la même clé ... Je veux juste obtenir quelque chose comme une table quelque chose comme ceci: {['id': 1, 'point': 2], ['id': 2 , 'point': 3]} mais pour la boucle ci-dessus est le résultat juste le dernier élément, car il écrase tout avant. Des idées????

+3

ne vérifie pas que la longueur d'une liste n'est pas vide avant de la parcourir. ceci est implicite dans son itération. – aaronasterling

+1

Vous devriez accepter la réponse de Kenny –

+0

si 'cur' est un curseur sur un db alors il y a probablement un type de curseur qui se comporte comme un dict. –

Répondre

2

Vous redéfinissez GID_Distances à un dictionnaire vide dans la boucle sans d'abord stocker la valeur. stocker les lignes dans une liste comme ceci:

rows = cur.fetchall() 
columns=[desc[0] for desc in cur.description] 
results = [] 
for row in rows: 
    GID_Distances = {} 
    items = zip(columns, row) 
    for (name, value) in items: 
    GID_Distances[name]=value 
    results.append(GID_Distances) 
+0

mais cette erreur se produit: NameError: le nom global 'GID_Distances' n'est pas défini – aleho

+1

il doit y avoir une faute de frappe alors. il n'y a pas de bonne raison que cela arrive. Par exemple, vous accédez très bien à 'columns' et vous le définissez au même niveau de bloc que' GID_Distances'. Vérifiez que votre orthographe est la même dans les deux endroits. – aaronasterling

+0

ne pense pas qu'il ya une faute de frappe, parce que c'est le même code ... je viens d'ajouter un # ... – aleho

3

Si vous avez un itérables de paires [(k1,v1),(k2,v2),...] à savoir, vous pouvez appliquer dict sur elle pour en faire un dictionnaire. Par conséquent, votre code peut être écrit simplement comme

rows = cur.fetchall() 
columns = [desc[0] for desc in cur.description] 
# or: columns = list(map(operator.itemgetter(0), cur.description)) 
#  don't call list() in Python 2.x. 
GID_Distances = [dict(zip(columns, row)) for row in rows] 
# note: use itertools.izip in Python 2.x 
+0

+1 oublié dict – aaronasterling

+0

Cela a fonctionné parfait! uhu, tellement plus court ... génial! donc, je vais voir si je peux continuer avec ça ... je dois changer parce que j'ai utilisé le dictionnaire avant! Merci pour votre aide, c'est grand! – aleho

Questions connexes