2011-08-03 2 views
1

Mon problème est de savoir comment mapper des valeurs de dictionnaire aux index de ligne. J'ai un dictionnaire comme:Dictionnaire de mappage avec valeurs de lignes

ordered_dict = OrderedDict(1:"id", 2:"name", 3:"address", 4:"salary") 

Et je suis arrivé lignes d'une requête select comme: Avec le code suivant

row = ["David", 4500, "France", 121] 

, où je reçois id comme premier indice dans le dictionnaire, qui est le quatrième cas de row, je veux les mapper de telle sorte que la valeur de variable obtiendra réellement les valeurs du id du row.

for item in ordered_dict.iteritems: 
    value = row[index of current item in dictionary] # which is 1 for the id. 

Mais je veux l'indice de id dans un row. c'est à dire.

value = row[index of id in row] # that is, value = row [4] 

afin que je puisse récupérer la valeur de id de row, qui est 121.

Je ne peux pas casser la structure actuelle du dictionnaire ou la requête select, donc je cherche un moyen de mapper les éléments de ligne au dictionnaire.

Edit: Dans le code ci-dessus ce que je reçois dans la première itération est

value = row[0] # here 0 is the id of dictionary, 

Mais si row[0] récupérera "David" comme indice 0 de row contient "David", je veux l'indice de id à être mis en correspondance avec row , qui est 3 dans mon exemple, de sorte que je vais obtenir value = row[3], ici 3 est l'index de id en row, et par conséquent je vais obtenir 121 comme résultat.

+1

Je ne comprends pas votre problème. Pourriez-vous s'il vous plaît fournir la sortie attendue? –

+0

pouvez-vous poster votre requête pour la récupération des données? vous pouvez faire l'ordre désiré lors de la sélection des colonnes dans la requête afin qu'il puisse mapper avec le dictionnaire –

+0

J'ai édité mon poste avec la sortie attendue. –

Répondre

3

Cela devrait faire le travail:

results = cursor.fetchall() 
col_names = [column[0] for column in cursor.description] 
rows_dict = map(lambda row: dict(zip(col_names, row)), results) 

Il travaille pour PostgreSQL et SQLite3, mais je l'ai pas testé avec MySQL. Si pour l'indexError postgres ou quelque chose comme ceci se produit, essayez de changer la deuxième ligne sur:

col_names = [column.name for column in cursor.description] 
Questions connexes