if-else在词典理解中

时间:2017-04-13 10:54:33

标签: python python-3.x dictionary dict-comprehension

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

无法使用else作为理解本身的一部分(请参阅this),但至少在listset理解中,可以使用conditional_expression listcomp(见this)。

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) 的示例是here

我的示例代码是:

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

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

1 个答案:

答案 0 :(得分:3)

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

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