【问题标题】:python ternary operator with assignment带赋值的python三元运算符
【发布时间】:2011-10-19 09:12:45
【问题描述】:

我是 python 新手。我正在尝试写这个

if x not in d:
    d[x] = {}
q = d[x]

以更紧凑的方式使用三元运算符

q = d[x] if x in d else (d[x] = {})

但这会产生语法错误。我错过了什么?

【问题讨论】:

    标签: python


    【解决方案1】:

    Python 中的条件运算符仅用于表达式,但赋值是语句。你可以使用

    q = d.setdefault(x, {})
    

    在这种情况下获得所需的效果。另请参阅documentation of dict.setdefault()

    【讨论】:

      【解决方案2】:

      在 Python 中,赋值不能出现在表达式中,因此你不能编写像 a = (b = c) 这样的代码。

      你正在寻找setdefault:

      q = d.setdefault(x, {})
      

      或者,使用defaultdict

      【讨论】:

        【解决方案3】:

        else (d[x] = {}) 是语法错误的原因是在 Python 中,赋值是一个语句。但是条件运算符需要表达式,虽然每个表达式都可以是一个语句,但并不是每个语句都是一个表达式。

        【讨论】:

          【解决方案4】:

          你也可以使用 Python 的字典 get() 方法

          q = d.get(x, {})
          

          说明:

          如果键在字典中,get() 方法返回指定键的值。

          get()的语法是:

          dict.get(key[, value]) 
          

          get() 参数

          get() 方法最多接受两个参数:

          key - 要在字典中搜索的键

          value(可选)- 如果找不到键,则返回值。默认值为无。

          get() 的返回值

          get() 方法返回:

          • 如果键在字典中,则为指定键的值。
          • 如果未找到键且未指定值,则为无。
          • 如果未找到键并指定了值,则为值。

          另一种选择是使用defaultdict

          from collections import defaultdict
          
          d = defaultdict(dict)
          q = d[x]
          
          >>> q
          >>> {}
          

          【讨论】:

            【解决方案5】:

            这就是setdefault() 的用途:

            q = d.setdefault(x, {})
            

            它完全符合你的要求:

            • 如果xd 中的一个键,则返回d[x]
            • 如果 x 还不是密钥,则将 {} 分配给 d[x] 并返回该密钥

            【讨论】:

              【解决方案6】:

              对于那些对三元运算符(也称为conditional expression)感兴趣的人,这里有一种方法可以使用它来完成一半的原始目标:

              q = d[x] if x in d else {}

              x if C else y 形式的条件表达式将根据条件C 计算并返回xy 的值。然后将结果分配给q

              【讨论】:

              • 嗯,这是一个老问题......不幸的是,你的答案不正确 - 我正在寻找一种方法来返回一个空字典并同时将其分配给 d[x] -您的代码没有做的事情(请检查其他答案)。尽管如此,为您的努力 +1,欢迎来到 SO!
              • 感谢您指出我的错误。我编辑了我的答案以反映其不完整的性质。另外,感谢您的热烈欢迎!
              猜你喜欢
              • 2022-06-28
              • 2013-06-28
              • 2014-02-12
              • 2021-04-29
              • 2015-05-23
              • 2023-04-03
              • 2011-03-06
              • 2011-07-02
              • 2012-02-14
              相关资源
              最近更新 更多