在Python中为几个列表创建统计字典?

时间:2016-06-14 19:31:18

标签: python dictionary dictionary-comprehension

我想为几个数据列表创建一些基本统计信息并将它们存储在字典中:

>>> 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;还没有定义?关于如何完成这项工作的任何建议或可以实现相同输出的不同例程?

2 个答案:

答案 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]}