dict理解中的海象运算符

Posted

技术标签:

【中文标题】dict理解中的海象运算符【英文标题】:walrus operator in dict comprehension 【发布时间】: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

为什么?我哪里弄错了?

【问题讨论】:

【参考方案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 的答案已经在这样做了:)

以上是关于dict理解中的海象运算符的主要内容,如果未能解决你的问题,请参考以下文章

带有三元运算符的海象运算符的正确语法是啥?

局部变量上的MySQL海象运算符?

Python 炫技操作:海象运算符的三种用法

Python 海象运算符 (:=) 的三种用法

❤️思维导图整理大厂面试高频数组15: 介绍Entry类和海象运算符, 哈希表解决最短连续子数组, 力扣697❤️

❤️思维导图整理大厂面试高频数组15: 介绍Entry类和海象运算符, 哈希表解决最短连续子数组, 力扣697❤️