Существует ли способ в Python 2.7+ сделать что-то вроде следующего?
{ something_if_true if condition else something_if_false for key, value in dict_.items() }
Я знаю, что вы можете сделать что-нибудь с помощью «если»:
{ something_if_true for key, value in dict_.items() if condition}
python
dictionary
dictionary-comprehension
diegueus9
источник
источник
dict
состоит изkey:value
элементов, вы строите неdict
здесь, а aset
(см. набор литералов ).Ответы:
Вы уже получили его:
A if test else B
это допустимое выражение Python. Единственная проблема с вашим пониманием в словах, как показано, состоит в том, что место для выражения в понимании слова должно иметь два выражения, разделенных двоеточием:Последнее
if
предложение действует как фильтр, который отличается от условного выражения.источник
{(a if condition else b): value for key, value in dict.items()}
будет работать.Ответ Марцина охватывает все, но на тот случай, если кто-то захочет увидеть реальный пример, я добавлю два ниже:
Допустим, у вас есть следующий словарь множеств
и вы хотите создать новый словарь, ключи которого указывают, содержится ли строка
'a'
в значениях или нет, вы можете использоватьчто дает
Теперь давайте предположим, что у вас есть два словаря, как это
и вы хотите заменить ключи
d1
на ключи,d2
если соответствующие значения идентичны, вы можете сделатькоторый дает
источник
d1
,d2
я получаюAttributeError: 'dict_values' object has no attribute 'index'
Если у вас есть разные условия для оценки ключей и значений, ответ @ Marcin - это то, что вам нужно.
Если у вас одинаковые условия для ключей и значений, вам лучше использовать сборки (ключ, значение) в выражениях генератора, передавая в
dict()
:Его легче читать, и условие оценивается только один раз для каждого ключа, значения.
Пример с заимствованием @ словаря множеств Клеба:
Предположим, что вы хотите использовать суффикс только
keys
сa
егоvalue
и вы хотитеvalue
заменить длину набора в таком случае. В противном случае пара ключ-значение должна остаться без изменений.источник
Другой пример использования if / else в словарном понимании
Я работаю над настольным приложением для ввода данных для моей собственной офисной работы, и такое приложение для ввода данных обычно получает все записи из виджета ввода и выгружает их в словарь для дальнейшей обработки, такой как проверка или редактирование, которое мы должны вернуть выбранные данные из файла обратно в виджеты ввода и т. д.
Первый раунд с использованием традиционного кодирования (8 строк):
Второй раунд Я пытался использовать словарное понимание, но цикл все еще там (6 строк):
И, наконец, с помощью однострочного выражения для словаря (1 строка):
Я использую Python 3.8.3
источник