Je pratique des exercices de syntaxe python et j'ai décidé d'écrire une compréhension de dictionnaire basée sur une compréhension de liste conçue de manière similaire. Mais alors que la dernière est OK, la première entraîne une erreur de syntaxe.
Ceci est ma compréhension de la liste ..
>>> l = [z**z if z%2 else z for z in range(5)]
[0, 1, 2, 27, 4]
Et c'est ma compréhension du dictionnaire ..
>>> d = {z:z**z if z%2 else z:z for z in range(5)}
^
SyntaxError: invalid syntax
Existe-t-il un moyen d'écrire une compréhension de dictionnaire de conception similaire à ma compréhension de liste?
3 réponses
Vous pouvez simplement écrire
In [16]: d = {z:z**z if z%2 else z for z in range(5)}
In [17]: d
Out[17]: {0: 0, 1: 1, 2: 2, 3: 27, 4: 4}
Qui est plus facile à lire si vous fournissez des parenthèses:
In [18]: d = {z:(z**z if z%2 else z) for z in range(5)}
In [19]: d
Out[19]: {0: 0, 1: 1, 2: 2, 3: 27, 4: 4}
La partie jointe est une expression ternaire Python pour la valeur, pas pour la paire (clé, valeur).
@timgeb mais que se passe-t-il s'il veut aussi changer la clé dans le reste?
(Supposons que nous voulons z*10
.) Dans des cas comme celui-ci, vous pourriez écrire quelque chose comme
In [24]: d = {(z*10 if z%2 else z):(z**z if z%2 else z) for z in range(5)}
In [25]: d
Out[25]: {0: 0, 10: 1, 4: 4, 2: 2, 30: 27}
Mais cela est inefficace car z%2
est calculé deux fois.
Il est préférable d'utiliser le fait que le constructeur dict
prend un itérable d'itérables à deux éléments:
In [26]: dict((z*10, z**z) if z%2 else (z, z) for z in range(5))
Out[26]: {0: 0, 10: 1, 4: 4, 2: 2, 30: 27}
Essayer:
{z:z**z if z%2 else z for z in range(5)}
Production:
{0: 0, 1: 1, 2: 2, 3: 27, 4: 4}
[Finished in 0.2s]
d = {z:z**z if z%2 else z for z in range(5)}
print(d)
Donne la sortie:
{0: 0, 1: 1, 2: 2, 3: 27, 4: 4}
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.