Jak używać if/else w słowniku?

W python2. 7 + istnieje jakiś sposób, aby zrobić coś takiego:

{ something_if_true if condition else something_if_false for key, value in dict_.items() }

Wiem, że możesz zrobić wszystko tylko "jeśli"

{ something_if_true for key, value in dict_.items() if condition}
Author: Cleb, 2012-02-25

2 answers

Już to masz: A if test else B jest poprawnym wyrażeniem Pythona. Jedynym problemem ze zrozumieniem dict, jak pokazano, jest to, że miejsce dla wyrażenia w zrozumieniu dict musi mieć dwa wyrażenia, oddzielone dwukropkiem: {]}

{ (some_key if condition else default_key):(something_if_true if condition 
          else something_if_false) for key, value in dict_.items() }

Końcowa klauzula if działa jako filtr, który różni się od wyrażenia warunkowego.

 123
Author: Marcin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-27 08:23:06

@odpowiedź Marcina obejmuje wszystko, ale na wszelki wypadek, gdyby ktoś chciał zobaczyć prawdziwy przykład, dodaję dwa poniżej:

Załóżmy, że masz następujący słownik zbiorów

d = {'key1': {'a', 'b', 'c'}, 'key2': {'foo', 'bar'}, 'key3': {'so', 'sad'}}

I chcesz utworzyć nowy słownik, którego klucze wskazują, czy łańcuch 'a' jest zawarty w wartościach, czy nie, możesz użyć

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()}

Co daje

{'a_in_values_of_key1': {'a', 'b', 'c'},
 'a_not_in_values_of_key2': {'bar', 'foo'},
 'a_not_in_values_of_key3': {'sad', 'so'}}

Załóżmy, że masz dwa takie słowniki

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'}}

I chcesz wymienić klucze w d1 za pomocą kluczy d2 jeśli wartości są identyczne, można wykonać

# 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()}

Co daje

{'bad_key2': {'bar', 'foo'},
 'bad_key3': {'sad', 'so'},
 'good_key2': {'a', 'b', 'c'}}
 3
Author: Cleb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-08 09:52:37