字典理解中的 if-else

if-else in a dictionary comprehension

是否可以在 dictcomp 中使用 else 语句(如果可以,如何使用?)?

无法将 else 用作理解本身的一部分(参见 this) but at least in list and set comprehensions it is possible to use the conditional_expression (see this)。

listcomp 的示例是 here

我的示例代码是:

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} 应该不起作用。

我知道我可以通过使用两个 dictcomp 来绕过这个问题,但我想知道为什么这不起作用。

这是因为条件适用于字典的值,而不适用于键值对,即它被评估为:

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())