字典理解中的 if-else
if-else in a dictionary comprehension
是否可以在 dictcomp
中使用 else
语句(如果可以,如何使用?)?
无法将 else
用作理解本身的一部分(参见 this) but at least in list
and set
comprehensions it is possible to use the conditional_expression
(see 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}
应该不起作用。
我知道我可以通过使用两个 dictcomp 来绕过这个问题,但我想知道为什么这不起作用。
这是因为条件适用于字典的值,而不适用于键值对,即它被评估为:
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())
是否可以在 dictcomp
中使用 else
语句(如果可以,如何使用?)?
无法将 else
用作理解本身的一部分(参见 this) but at least in list
and set
comprehensions it is possible to use the conditional_expression
(see 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}
应该不起作用。
我知道我可以通过使用两个 dictcomp 来绕过这个问题,但我想知道为什么这不起作用。
这是因为条件适用于字典的值,而不适用于键值对,即它被评估为:
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())