字典理解中的海象运算符

FAL*_*FAL 14 python dictionary-comprehension python-3.9 walrus-operator

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

>>> 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}
Run Code Online (Sandbox Code Playgroud)

但这给了我以下错误:

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
Run Code Online (Sandbox Code Playgroud)

仅当我尝试使用该变量时才会发生此错误,定义它时没有问题:

>>> 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}
Run Code Online (Sandbox Code Playgroud)

为什么?我哪里弄错了?

tim*_*geb 14

你的代码大致相当于

q = {}
for x in dic:
    if mean > 65:
        mean := ...
        q[x] = mean
Run Code Online (Sandbox Code Playgroud)

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

您需要将定义移动到字典理解的 if 子句部分。

>>> 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}
Run Code Online (Sandbox Code Playgroud)

这翻译成

q = {}
for x in dic:
    if (mean := ...) > 65:
        q[x] = mean
Run Code Online (Sandbox Code Playgroud)