在字典推导式中使用if-else

3
dictcomp 中是否可以使用 else 语句?如果可以,怎样使用?根据 官方文档 的说明,无法在推导式本身中使用 else 语句,但是至少在 listset 推导式中可以使用 conditional_expression,具体细节请参见这里。关于 listcomp 的示例请看这里。以下是我的示例代码:
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 来绕过这个问题,但我想知道为什么这样不行。

1个回答

6

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接