if-else в словарном понимании
Можно ли использовать else
заявление (и если да, то как?) в dictcomp
?
Не возможно использовать else
как часть самого понимания (см. это), но, по крайней мере, в list
а также set
Понимания можно использовать conditional_expression
(см. это).
Пример для listcomp
здесь
Мой пример кода:
converters = {"id": int}
rows = [{"id": "1", "name": "foo"}, {"id": "2", "name": "bar"}]
for row in rows:
row = {k: converters[k](v) if k in converters else k:v for k,v in row.items()}
print(row)
Это не работает.
Странная часть в том, что
row = {k: converters[k](v) if k in converters for k, v in row.items()}
тоже не работает, хотя должно быть в порядке.
row = {k: converters[k](v) for k, v in row.items() if k in converters}
работает, но это не тот результат, которого я хочу.row = {k: converters[k](v) for k, v in row.items() if k in converters else k:v}
не должно работать, как я указал выше.
Я знаю, что могу обойти проблему, используя два диктофона, но я хочу знать, почему это не работает.
1 ответ
Это связано с тем, что условие применяется к значению словаря, а не к паре ключ-значение, т. Е. Оно оценивается как:
row = {k: (converters[k](v) if k in converters else k:v) for k,v in row.items()}
а также k:v
здесь синтаксически не допустимо, оно допустимо только внутри пары фигурных скобок или в сигнатуре функции (так что вы можете поместить k:v
в скобках и исправить SyntaxError
но это меняет конечный результат).
Решение состоит в том, чтобы просто указать значение в условном выражении, поскольку это то, что изменяется:
row = {k: converters[k](v) if k in converters else v for k,v in row.items()}
Другой вариант, конечно, вместо этого поставить кортежи dict
конструктор:
row = dict((k, converters[k](v)) if k in converters else (k,v) for k,v in row.items())