【问题标题】:walrus operator in dict comprehensiondict理解中的海象运算符
【发布时间】:2021-11-25 20:14:46
【问题描述】:

我想避免在字典理解中对平均值进行双重评估,我尝试使用海象运算符:

>>> dic = {"A": [45,58,75], "B": [55,82,80,92], "C": [78,95,90], "D":[98,75]}
>>> q = {x: (mean := (sum(dic[x]) // len(dic[x]))) for x in dic if mean > 65}

但这给了我以下错误:

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    q = {x: (mean := (sum(dic[x]) // len(dic[x]))) for x in dic if mean > 65}
  File "<pyshell#2>", line 1, in <dictcomp>
    q = {x: (mean := (sum(dic[x]) // len(dic[x]))) for x in dic if mean > 65}
  NameError: name 'mean' is not defined

这个错误只在我尝试使用变量时发生,定义它时没有问题:

>>> q = {x: (mean := (sum(dic[x]) // len(dic[x]))) for x in dic if (sum(dic[x]) // len(dic[x])) > 65}
>>> mean
86
>>> q
{'B': 77, 'C': 87, 'D': 86}

为什么?我哪里弄错了?

【问题讨论】:

    标签: python dictionary-comprehension python-3.9 walrus-operator


    【解决方案1】:

    你的代码大致相当于

    q = {}
    for x in dic:
        if mean > 65:
            mean := ...
            q[x] = mean
    

    这意味着您在分配之前使用mean

    您需要将定义移动到 dict-comprehension 的 if-clause-section。

    >>> dic = {"A": [45,58,75], "B": [55,82,80,92], "C": [78,95,90], "D":[98,75]}
    >>> q = {x: mean for x in dic if (mean := (sum(dic[x]) // len(dic[x]))) > 65}
    >>> q
    {'B': 77, 'C': 87, 'D': 86}
    

    这转化为

    q = {}
    for x in dic:
        if (mean := ...) > 65:
            q[x] = mean
    

    【讨论】:

      【解决方案2】:

      您需要将赋值表达式放在理解的条件中,而不是字典的值组件中:

      dic = {"A": [45,58,75], "B": [55,82,80,92], "C": [78,95,90], "D":[98,75]}
      q = {x:mean for x in dic if (mean := (sum(dic[x]) // len(dic[x]))) > 65}
      

      输出:

      {'B': 77, 'C': 87, 'D': 86}
      

      【讨论】:

      • 也许您可以在很清楚为什么会这样的地方添加非理解版本(if 部分在x: mean 部分之前执行之前)编辑:刚刚看到@timgeb 的答案已经在这样做了:)
      猜你喜欢
      • 2022-07-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 2020-11-17
      • 2019-12-10
      • 1970-01-01
      • 2020-02-19
      • 2021-03-09
      相关资源
      最近更新 更多