web-dev-qa-db-fra.com

Construire un dictionnaire dans Python Loop - Liste et compréhensions de dictionnaire

Je joue avec des boucles en python. Je connais bien la boucle "for":

for x in y:
    do something

Vous pouvez également créer une liste simple à l'aide d'une boucle:

i = []
for x in y:
   i.append(x)

et puis j'ai récemment découvert un type de boucle efficace et sympa, ici sur Stack, pour construire une liste (y a-t-il un nom pour ce type de boucle? J'aimerais vraiment le savoir pour pouvoir mieux le chercher):

[x.name for x in y]

Ok, cela étant dit, je voulais aller plus loin avec le dernier type de boucle et j'ai essayé de construire un dictionnaire python en utilisant le même type de logique:

{x[row.SITE_NAME] = row.LOOKUP_TABLE for row in cursor}

à la place d'utiliser:

x = {}
for row in cursor:
   x[row.SITE_NAME] = row.LOOKUP_TABLE

Je reçois un message d'erreur sur le signe égal me disant que c'est une syntaxe invalide. Je crois que dans ce cas, cela me dit essentiellement que le signe égal est une clause conditionnelle (==), pas une déclaration d'une variable.

Ma deuxième question est, puis-je créer un dictionnaire python en utilisant ce type de boucle ou suis-je loin de la base? Si oui, comment pourrais-je le structurer?

28
Mike

La forme courte est la suivante (appelée compréhension de dict, par analogie avec compréhension de liste, compréhension de définition etc.):

x = { row.SITE_NAME : row.LOOKUP_TABLE for row in cursor }

donc en général étant donné quelques _container avec une sorte d'éléments et une fonction _value qui, pour un élément donné, renvoie la valeur que vous souhaitez ajouter à cette clé dans le dictionnaire:

{ _key : _value(_key) for _key in _container }
48
lejlot

Ce que vous utilisez s'appelle une compréhension de liste. Ils sont assez géniaux;)

Ils ont un cousin appelé une expression de générateur qui fonctionne comme une compréhension de liste, mais au lieu de construire la liste en une seule fois, ils génèrent un élément à la fois. D'où le générateur de nom. Vous pouvez même créer des fonctions qui sont des générateurs - il y a cependant beaucoup de questions et de sites pour couvrir ces informations.

Vous pouvez effectuer l'une des deux opérations suivantes:

x = dict(((row.SITE_NAME, row.LOOKUP_TABLE) for row in cursor))

Ou, si vous avez une version suffisamment nouvelle de Python, il y a quelque chose appelé une compréhension de dictionnaire - qui fonctionne comme une compréhension de liste, mais produit un dictionnaire à la place.

x = {row.SITE_NAME : row.LOOKUP_TABLE for row in cursor}
9
Wayne Werner

Vous pouvez le faire comme ceci:

x = dict((row.SITE_NAME, row.LOOKUP_TABLE) for row in cursor)
6
Carsten