2009-12-17 9 views
0

Problème simple, je l'ai résolu .. mais python a un million de façons de résoudre le même problème. Je ne veux pas la solution la plus laconique, je veux juste un qui a plus de sens que ce qui suit:Quelle est une meilleure façon de gérer cela en Python

# sql query happens above, returns multiple rows 
rows = cursor.fetchall() 
cursor.close() 
cntdict = {} 
for row in rows: 
    a, b, c = row[0], row[1], row[2] 
    cntdict = { 
     a : { "b":b, "c":c } 
    } 
print dict(cntdict) 

note, une est toujours unique ci-dessus. Je veux un dictionnaire créé à partir du jeu de résultats. Plus tard dans mon script j'ai besoin de référencer les valeurs dans le dictionnaire pour chaque ligne qui s'est produite. J'essaie d'indexer le dictionnaire en faisant la clé de la valeur de la var a. cela devrait pointer vers un autre dictionnaire avec deux autres paires clé/valeur qui décrivent un ... à moins qu'il n'y ait une façon plus intelligente/plus courte de le faire.

Répondre

12

Vous pouvez faire la même chose avec une expression du générateur et le constructeur dictionnaire:

dict((row[0], {"b": row[1], "c": row[2]}) for row in rows) 

Et voici le code dans l'action:

>>> rows = [[1, 2, 3], [4, 5, 6]] 
>>> dict((row[0], {"b": row[1], "c": row[2]}) for row in rows) 
{1: {'c': 3, 'b': 2}, 4: {'c': 6, 'b': 5}} 

Je ne me souviens pas si MySQLdb renvoie des lignes liste des tuples, si tel est le cas, alors vous pouvez le faire:

dict((a, {"b": b, "c": c}) for a, b, c in rows) 
+0

+1 putain qui est bon –

+0

s/liste compréhension/expression du générateur/ –

+0

Merci Ned, corrigé. –

-2

vous pouvez loo k en utilisant un ORM pour extraire votre base de données. Je ne peux pas dire avec certitude à partir d'un extrait aussi court, mais il semble que vos données pourraient bien fonctionner avec un ORM si vous ne faites que construire une dictée de toute façon.

Mes trois ORM préférés: celui Django (facile à utiliser, qui fonctionne le mieux avec des données qui est normal), SQLAlchemy (meilleur choix si votre base de données a un schéma complexe), et Autumn (petit et simple, idéal pour une utilisation avec SQLite).

0

Comme l'a fait remarquer Nadia, l'expansion de tuple est très pratique lorsque vous travaillez avec des résultats de requête. Ses expressions dict() sont vraiment bien dans ce cas, mais pour d'autres requêtes lorsque vous devez faire quelque chose de différent avec les résultats, utilisez simplement l'expansion de tuple dans la boucle:

for a, b, c in rows: 
    # do something 
Questions connexes