Existe-t-il un moyen dans Python 2.7+ de créer quelque chose comme ce qui suit?
{ something_if_true if condition else something_if_false for key, value in dict_.items() }
Je sais que vous pouvez faire n'importe quoi avec juste 'si':
{ something_if_true for key, value in dict_.items() if condition}
python
dictionary
dictionary-comprehension
diegueus9
la source
la source
dict
est fait d'key:value
éléments, vous ne construisez pas undict
ici mais unset
(voir les littéraux définis ).Réponses:
Vous l'avez déjà:
A if test else B
est une expression Python valide. Le seul problème avec votre compréhension de dict, comme indiqué, est que la place d'une expression dans une compréhension de dict doit avoir deux expressions, séparées par deux points:La
if
clause finale agit comme un filtre, ce qui est différent d'avoir l'expression conditionnelle.la source
{(a if condition else b): value for key, value in dict.items()}
fonctionnera.La réponse de @ Marcin couvre tout, mais juste au cas où quelqu'un voudrait voir un exemple réel, j'ajoute deux ci-dessous:
Disons que vous avez le dictionnaire d'ensembles suivant
et que vous souhaitez créer un nouveau dictionnaire dont les clés indiquent si la chaîne
'a'
est contenue dans les valeurs ou non, vous pouvez utiliserqui donne
Supposons maintenant que vous ayez deux dictionnaires comme celui-ci
et vous voulez remplacer les clés
d1
par les clés ded2
si les valeurs respectives sont identiques, vous pouvez fairequi donne
la source
d1
,d2
je reçoisAttributeError: 'dict_values' object has no attribute 'index'
Si vous avez différentes conditions à évaluer pour les clés et les valeurs, la réponse de @ Marcin est la voie à suivre.
Si vous avez la même condition pour les clés et les valeurs, il vaut mieux créer des doubles (clé, valeur) dans une expression de générateur alimentant
dict()
:C'est plus facile à lire et la condition n'est évaluée qu'une seule fois par clé, valeur.
Exemple d'emprunt du dictionnaire d'ensembles de @ Cleb:
Supposons que vous vouliez suffixer uniquement
keys
aveca
dans sonvalue
et que vous vouliez levalue
remplacer par la longueur de l'ensemble dans un tel cas. Sinon, la paire clé-valeur doit rester inchangée.la source
Un autre exemple d'utilisation de if / else dans la compréhension du dictionnaire
Je travaille sur une application de bureau de saisie de données pour mon propre travail de bureau, et il est courant pour une telle application de saisie de données d'obtenir toutes les entrées du widget d'entrée et de les vider dans un dictionnaire pour un traitement ultérieur comme la validation ou l'édition que nous devons retourner les données sélectionnées du fichier aux widgets d'entrée, etc.
Le premier tour en utilisant le codage traditionnel (8 lignes):
Au deuxième tour, j'ai essayé d'utiliser la compréhension du dictionnaire mais la boucle est toujours là (6 lignes):
Enfin, avec un énoncé de compréhension du dictionnaire sur une ligne (1 ligne):
J'utilise python 3.8.3
la source