字典理解中的 if-else

Lit*_*lue 2 python dictionary python-3.x dict-comprehension

是否有可能使用else的语句(如果是,怎么样?)的dictcomp

这是不可能使用else的理解本身的一部分(见),但至少在listset内涵,可以使用conditional_expression(见)。

的一个例子listcomphere

我的示例代码是:

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)
Run Code Online (Sandbox Code Playgroud)

这不起作用。

奇怪的部分是

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}不应该工作,正如我上面指出的那样。

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

Jim*_*ard 6

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

row = {k: (converters[k](v) if k in converters else k:v) for k,v in row.items()}
Run Code Online (Sandbox Code Playgroud)

并且k:v在这里在语法上无效,它仅在一对大括号内或在函数签名中有效(因此,您可以将其k:v放在括号中并修复SyntaxError但是,这会改变最终结果)。

解决方案是简单地提供条件中的值,因为这会发生变化:

row = {k: converters[k](v) if k in converters else v for k,v in row.items()}
Run Code Online (Sandbox Code Playgroud)

当然,另一种选择是向dict构造函数提供元组:

row = dict((k, converters[k](v)) if k in converters else (k,v) for k,v in row.items())
Run Code Online (Sandbox Code Playgroud)