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?
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 }
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}
Vous pouvez le faire comme ceci:
x = dict((row.SITE_NAME, row.LOOKUP_TABLE) for row in cursor)