【问题标题】:.get() only if value is not None.get() 仅当 value 不是 None
【发布时间】:2021-04-18 11:40:00
【问题描述】:

我想遍历一个字典并对数据进行一些计算。但我不想要 NoneType 数据,否则我会收到错误消息。所以我这样做:

sum_value = 0 if values.get("sum", 0) is None else values.get("sum", 0)

在 Python 中没有更好的方法吗?

【问题讨论】:

  • 如果values["sum"] 不存在,values.get("sum", 0) 已经返回 0。或者你的意思是values["sum"]本身可以是None
  • 是的,values["sum"] 本身可以是None
  • 最好的办法是防止values["sum"] 可以是None
  • 这是不可能的
  • 这种行为让我想起了 django 中的数字聚合,其中空查询集的聚合值为 None

标签: python


【解决方案1】:

你可以这样做:

sum_value = values.get("sum") or 0

or 将为所有假(假)第一个操作数选择第二个操作数,其中包括 None,但不包括所有非零数字。

【讨论】:

  • or 是什么意思?
  • 一般来说,andor 都会计算出第一个操作数来确定结果是否为真。对于and,这是第一个假操作数(如果没有真值操作数,则为最后一个),对于or,它是第一个真值操作数(或总体上最后一个)。
【解决方案2】:

我相信 values.get("sum", 0) 已经足够了,因为如果字典在指定键下不包含任何内容,则返回的默认值是 0。

【讨论】:

  • 如果key的值为NoneType?
  • 虽然,当我执行 'round(sum_value, 2)' 时,我得到一个 TypeError: type NoneType doesn't define round method
【解决方案3】:

我只会使用普通的if 语句来更新值,在 Python 3.8 或更高版本中使用赋值语句捕获

if (sum_value := values.get("sum", 0)) is None:
    sum_value = 0

或早于 Python 早期版本中的 if 语句。

sum_value = values.get("sum", 0)
if sum_value is None:
    sum_value = 0

您也可以在条件表达式中使用赋值表达式:

sum_value = 0 if (x:=values.get("sum", 0)) is None else x

【讨论】:

    【解决方案4】:

    我认为您正在寻找字典理解:

    {x:(y if y else 0) for x,y in r.items()}

    这里有另一个很好的帖子

    How can I use if/else in a dictionary comprehension?

    【讨论】:

    • NoneType 不是现有的内置名称。改为测试if y is None,或执行x: y or 0
    • 即使它内置名称,比较类型是否相等也是不受欢迎的。
    • @chepner 当然是下一个问题 =) 特别是对于只有一个实例的类型,因此提示测试实例身份。
    • 感谢您的反馈。我想我应该在发布之前运行代码:)。回复已编辑。为什么通常不赞成进行类型比较?这是一般规则还是在这种情况下具体? @chepner
    • 至少,它绕过了继承。例如,type(True) == int 为假,但Trueint,在某种意义上boolint 的子类。您很少关心值的确切类型。
    猜你喜欢
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2021-11-25
    相关资源
    最近更新 更多