Lit*_*lue 2 python dictionary python-3.x dict-comprehension
是否有可能使用else的语句(如果是,怎么样?)的dictcomp?
这是不可能使用else的理解本身的一部分(见本),但至少在list和set内涵,可以使用conditional_expression(见本)。
的一个例子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 来绕过这个问题,但我想知道为什么这不起作用。
那是因为条件适用于字典的值,而不适用于键值对,即它被评估为:
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())
| 归档时间: | 
 | 
| 查看次数: | 5310 次 | 
| 最近记录: |