首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字典理解中的海象运算符

字典理解中的海象运算符
EN

Stack Overflow用户
提问于 2021-10-05 14:30:41
回答 2查看 554关注 0票数 8

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

代码语言:javascript
复制
>>> 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}

但这给了我以下错误:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
>>> 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}

为什么?我哪里弄错了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-05 14:34:57

您的代码大致相当于

代码语言:javascript
复制
q = {}
for x in dic:
    if mean > 65:
        mean := ...
        q[x] = mean

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

您需要将定义移动到dict-comprehension的if-子句部分。

代码语言:javascript
复制
>>> 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}

这可以翻译为

代码语言:javascript
复制
q = {}
for x in dic:
    if (mean := ...) > 65:
        q[x] = mean
票数 8
EN

Stack Overflow用户

发布于 2021-10-05 14:34:15

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

代码语言:javascript
复制
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}

输出:

代码语言:javascript
复制
{'B': 77, 'C': 87, 'D': 86}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69452329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档