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())
Другие вопросы по тегам