是否可以在else
中使用dictcomp
语句(如果是,如何?)?
无法使用else
作为理解本身的一部分(请参阅this),但至少在list
和set
理解中,可以使用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来绕过这个问题,但我想知道为什么这不起作用。
答案 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())