Как использовать if/else в понимании словаря?

В python2.7 + существует любой способ сделать что-то вроде:

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

Я знаю, что вы можете сделать что угодно, только с "if"

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

Ответ 1

У вас уже есть: A if test else B - действительное выражение python. Единственная проблема с вашим пониманием dict, как показано, заключается в том, что место выражения в понимании dict должно иметь два выражения, разделенные двоеточием:

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

Заключительное предложение if действует как фильтр, который отличается от условного выражения.

Ответ 2

Ответ @Marcin покрывает все это, но на случай, если кто-то захочет увидеть реальный пример, я добавлю два ниже:

Допустим, у вас есть следующий словарь множеств

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

и вы хотите создать новый словарь, ключи которого указывают, содержится ли в значениях строка 'a', вы можете использовать

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

который дает

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

Теперь предположим, что у вас есть два таких словаря

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

и вы хотите заменить ключи в d1 на ключи d2 если соответствующие значения идентичны, вы можете сделать

# here we assume that the values in d2 are unique
# Python 2
dout2 = {d2.keys()[d2.values().index(v1)] if v1 in d2.values() else k1: v1 for k1, v1 in d1.items()}

# Python 3
dout2 = {list(d2.keys())[list(d2.values()).index(v1)] if v1 in d2.values() else k1: v1 for k1, v1 in d1.items()}

который дает

{'bad_key2': {'bar', 'foo'},
 'bad_key3': {'sad', 'so'},
 'good_key2': {'a', 'b', 'c'}}

Ответ 3

Предположим, я хочу создать словарь оценок, который отображает оценки с оценками, например

 Marks      Grade
 0-40    -  F
 40-50   -  D
 50-60   -  C and so on 

Для этого я могу использовать словарное понимание с несколькими, если еще условия, показанные ниже:

 marks_dict = {x:"F" if x<40 else "D" if x<50 else "C+" if x<60 else "C" if x<70 
 else "B+" if x<80 else "A" if x<90 else "A+" if x<=100 else "NULL" for x in range(0,101)}

Это то, как вы можете использовать несколько условий if в понимании словаря, но, пожалуйста, убедитесь, что в конце есть последний блок else, иначе будет выдано сообщение об ошибке.

Благодарю.