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?

-1
BinaryBob 15 avril 2018 à 19:48

3 réponses

Meilleure réponse

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}
1
timgeb 15 avril 2018 à 16:59

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]
0
rahul mehra 15 avril 2018 à 16:53
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}
0
kvmahesh 15 avril 2018 à 16:54