2016-06-14 87 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]}