我想为几个数据列表创建一些基本统计信息并将它们存储在字典中:
>>> from statistics import mean,median
>>> a,b,c=[1,2,3],[4,5,6],[7,8,9]
以下列表理解工作并输出" a":
的统计数据>>> [eval("{}({})".format(op,a)) for op in ['mean','median','min','max']]
[2, 2, 1, 3]
将列表的变量名称(a)分配给另一个对象(dta)并评估" dta"在列表中理解也有效:
>>> dta="a"
>>> [eval("{}({})".format(op,eval("dta"))) for op in ['mean','median','min','max']]
[2, 2, 1, 3]
但是当我尝试在字典理解中将它们组合在一起时,它不起作用:
>>> {k:[eval("{}({})".format(op,eval("k"))) for op in ['mean','median','min','max']] for k in ['a','b','c']}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <dictcomp>
File "<stdin>", line 1, in <listcomp>
File "<string>", line 1, in <module>
NameError: name 'k' is not defined
我的猜测是在理解之前处理了eval,这就是为什么&#39; k&#39;还没有定义?关于如何完成这项工作的任何建议或可以实现相同输出的不同例程?
答案 0 :(得分:2)
不要引用内部k
中的eval
:
{k:[eval("{}({})".format(op,eval(k))) for op in ['mean','median','min','max']] for k in ['a','b','c']}
^
完全删除eval
:
[[mean(k), median(k), min(k), max(k)] for k in [a, b, c]]
您可以使用键进行简单的解决方法,将其更改为词典理解。
答案 1 :(得分:0)
尝试在格式化函数中删除eval调用中的k周围的引号。
我运行了以下命令:
> from statistics import mean,median
> a,b,c=[1,2,3],[4,5,6],[7,8,9]
> {k:[eval("{}({})".format(op,eval(k))) for op in ['mean','median','min','max']] for k in ['a','b','c']}
并获得以下输出:
{'a': [2.0, 2, 1, 3], 'c': [8.0, 8, 7, 9], 'b': [5.0, 5, 4, 6]}