【问题标题】:single line if else in python dictionary comprehension methodpython字典理解方法中的单行if else
【发布时间】:2018-02-25 12:45:30
【问题描述】:

我刚刚尝试了这样的列表理解

[i if i==0 else i+100for i in range(0,3)]

它有效,但是当我尝试类似的 dict 理解时,它会引发错误:

d={3:3}
{d[i]:0 if i==3 else d[i]:True for i in range(0,4) }

可能是什么原因?如何使用if else 使用字典理解?

由此产生的错误:

    {d[i]:0 if i==3 else d[i]:True for i in range(0,4) }
                             ^
SyntaxError: invalid syntax

注意:我在这里使用的示例只是一个随机示例,而不是我的实际代码。 我可以使用替代解决方案来做到这一点,但我现在只看 dict 理解来学习。

【问题讨论】:

    标签: python list-comprehension dictionary-comprehension


    【解决方案1】:

    您使用的是conditional expression。它只能用于接受表达式的地方。

    在字典理解中,键和值部分是单独的表达式,由: 分隔(因此: 字符不是表达式的一部分)。您可以在其中的每一个中使用条件表达式,但不能对两者都使用一个。

    这里只需要在值部分使用即可:

    {d[i]: 0 if i == 3 else True for i in range(4)}
    

    但是,您将收到 KeyError 异常,因为 d 字典没有 012 键。

    参见表达式参考文档的Dictionary displays section

    dict_display       ::=  “{” [key_datum_list | dict_comprehension] “}”
    [...]
    dict_comprehension ::=  expression “:” expression comp_for
    

    [...]

    与列表和集合推导相比,字典推导需要两个用冒号隔开的表达式,后跟通常的“for”和“if”子句。

    【讨论】:

    • 但是,如果我声明的 dict 没有键,我就不能使用列表理解?就像你提到的“但是,你会得到一个 KeyError 异常,因为 d 字典没有 0、1 和 2 键”?
    • @syam:这与列表理解有什么关系?您有一个定义键的表达式d[i]。对于i = 0,该表达式将失败,没有d[0]。只有d[3] 存在。
    • 将此与常规的for 循环进行比较:首先是result = {},然后是for i in range(4):,然后是循环体中的key = d[i]value = 0 if i == 3 else Trueresult[key] = value。这正是 dict 理解所做的,但实际上没有使用名称 resultkeyvaluekey = d[i] 失败,因为没有 d[0]
    • 谢谢哥们!很好的解释
    【解决方案2】:

    dict理解if-else问题的另一种解决方案:

    dict((x, x ** 2) if x > 0 else (x, -x ** 2) for x in range(-4, 5))
    

    【讨论】:

      猜你喜欢
      • 2020-10-13
      • 2017-09-09
      • 1970-01-01
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 2012-03-15
      • 2013-07-13
      • 1970-01-01
      相关资源
      最近更新 更多