Comment utiliser if / else dans la compréhension d'un dictionnaire?
en python2.7 + existent n'importe quel moyen de faire quelque chose comme:
{ 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}
2 réponses
vous l'avez déjà: A if test else B
est une expression valide de python. Le seul problème avec votre compréhension de dict comme montré est que la place pour une expression dans une compréhension de dict doit avoir deux expressions, séparées par un deux-points:
{ (some_key if condition else default_key):(something_if_true if condition
else something_if_false) for key, value in dict_.items() }
la clause finale if
agit comme un filtre, ce qui est différent de l'expression conditionnelle.
la réponse de @Marcin couvre tout, mais juste au cas où quelqu'un veut voir un exemple réel, j'en ajoute deux ci-dessous:
disons que vous avez le dictionnaire définit
d = {'key1': {'a', 'b', 'c'}, 'key2': {'foo', 'bar'}, 'key3': {'so', 'sad'}}
et vous voulez créer un nouveau dictionnaire dont les clés indiquent si la chaîne 'a'
est contenue dans les valeurs ou non, vous pouvez utiliser
dout = {"a_in_values_of_{}".format(k) if 'a' in v else "a_not_in_values_of_{}".format(k): v for k, v in d.items()}
qui donne
{'a_in_values_of_key1': {'a', 'b', 'c'},
'a_not_in_values_of_key2': {'bar', 'foo'},
'a_not_in_values_of_key3': {'sad', 'so'}}
supposons maintenant que vous ayez deux dictionnaires comme celui-ci
d1 = {'bad_key1': {'a', 'b', 'c'}, 'bad_key2': {'foo', 'bar'}, 'bad_key3': {'so', 'sad'}}
d2 = {'good_key1': {'foo', 'bar', 'xyz'}, 'good_key2': {'a', 'b', 'c'}}
et vous voulez remplacer les touches dans d1
par les touches de d2
s'il y a des valeurs respectives sont identiques, vous pouvez faire
# here we assume that the values in d2 are unique
dout2 = {d2.keys()[d2.values().index(v1)] if v1 in d2.values() else k1: v1 for k1, v1 in d1.items()}
qui donne
{'bad_key2': {'bar', 'foo'},
'bad_key3': {'sad', 'so'},
'good_key2': {'a', 'b', 'c'}}