Как использовать понимание словаря и тернарный оператор для создания нового словаря в Python

Я хотел бы использовать понимание словаря и тернарный оператор для создания нового словаря. Вот МВЕ.

# Step 1: Create a dict, `d`
# {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f', 7: 'g', 8: 'h', 9: 'i', 10: 'j'}
import string
d = {k : v for k, v in zip(range(1, 11), string.ascii_lowercase[:10])}

# Step 2: Use dict comprehensions and the ternary operator to get a new dict
new_dict = {k : v if k<5 else v : k for k, v in d.items()}

но столкнуться с этой проблемой,

    new_dict = {k : v if k<5 else v : k for k, v in d.items()}
                                    ^
SyntaxError: invalid syntax

Почему SyntaxError растёт? Как это исправить?


person SparkAndShine    schedule 21.05.2016    source источник


Ответы (2)


Синтаксис key:value не является реальным выражением, поэтому вы не можете использовать над ним тернарный оператор. Вам нужно выполнить тернарную операцию отдельно для частей ключа и значения:

new_dict = {(k if k<5 else v) : (v if k<5 else k) for k, v in d.items()}

(Я изменил ваш тест на k<5, а не на v<5, предполагая, что вы хотите сравнить числовые ключи с 5; сравнение строковых значений с 5 не будет работать в Python 3 и даст бессмысленные результаты в Python 2.)

person BrenBarn    schedule 21.05.2016

Это правильный синтаксис.

new_dict = {k if k < 5 else v : v if k < 5 else k for k, v in d.items()}
person Vedang Mehta    schedule 21.05.2016
comment
Мой желаемый результат: if k>=5, поменять местами ключ и значение, то есть v : k. Но в вашем случае это v : v - person SparkAndShine; 21.05.2016
comment
Это не v : v. Это (k if k < 5 else v) : (v if k < 5 else k), если вы добавите фигурные скобки. - person Vedang Mehta; 21.05.2016
comment
Извините за мою неверную интерпретацию. Вы заслужили мой голос. - person SparkAndShine; 21.05.2016