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}
62
demandé sur Cleb 2012-02-25 13:04:45

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.

123
répondu Marcin 2013-05-27 08:23:06

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'}}
3
répondu Cleb 2017-12-08 09:52:37