Quería evitar la doble evaluación de una media en una comprensión dictada, e intenté usar el operador morsa:
>>> 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}pero esto me dio el siguiente error:
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 definedEste error solo ocurre cuando trato de usar la variable, no hay problema al definirla:
>>> 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}¿Por qué? ¿Dónde me equivoqué?
Debe colocar la expresión de asignación en el condicional de la comprensión, no en el componente de valor del diccionario:
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}Producción:
{'B': 77, 'C': 87, 'D': 86}Su código es más o menos equivalente a
q = {} for x in dic: if mean > 65: mean := ... q[x] = mean lo que significa que está utilizando mean antes de asignarla.
Debe mover la definición a la sección if-clause de la comprensión de dictado.
>>> 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}Esto se traduce en
q = {} for x in dic: if (mean := ...) > 65: q[x] = mean