2016-06-14 88 views
0

我想创建几个数据列出了一些基本的统计数据,并将它们存储在一个字典:在Python中为多个列表创建统计字典?

>>> from statistics import mean,median 
>>> a,b,c=[1,2,3],[4,5,6],[7,8,9] 

下面的列表理解的工作,并且输出统计信息“一”:

>>> [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] 

Bu T当我试图在一个字典解析一起配合这一点,这是行不通的:

>>> {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是修真之前处理,这就是为什么“K”尚未确定?有关如何获得这项工作的任何建议或完成相同产出的不同例程?

+0

有趣的问题,但你的代码工作:'{ 'A':[2.0,2,1, 3],'c':[8.0,8,7,9],'b':[5.0,5,4,6]} –

+0

为什么使用eval? –

+1

你为什么在这里使用'eval'? Python具有一流的功能:使用它们!例如[stat(a)for stat in [mean,median,min,max]]。 –

回答

2

不要在内部eval引用k

{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

第二个'eval'完全:'.... format(op,k))for op in ...' –

+0

@MarkDickinson对。更好的是没有任何'eval'。谢谢 –

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