2017-04-13 62 views
0

是否有可能在dictcomp中使用else语句(如果是,怎么办?)?if-else在词典理解中

这是不可能使用else的理解本身的一部分(见this),但至少在listset内涵,可以使用conditional_expression(见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}应该不起作用。

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

回答

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