【问题标题】:if-else in a dictionary comprehension [duplicate]字典理解中的 if-else [重复]
【发布时间】:2017-09-09 11:06:28
【问题描述】:

是否可以在dictcomp 中使用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 绕过这个问题,但我想知道为什么这不起作用。

【问题讨论】:

    标签: python python-3.x dictionary dict-comprehension


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-06-02
      • 1970-01-01
      • 2020-10-13
      • 2012-03-15
      • 2018-02-25
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多