В 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, иначе будет выдано сообщение об ошибке.
Благодарю.