2016-06-14 6 views
0

私はデータの複数のリストのためのいくつかの基本的な統計を作成し、辞書に保存したいと思います:Pythonでいくつかのリストの統計辞書を作成しますか?

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

富栄私は辞書理解にすべて一緒にこれを結びつけるしようとすると、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 

私の推測なぜ「k」はまだ定義されていないされて、evalが理解する前に処理されていることでしょうか?この仕事を得る方法や、同じ出力を達成する別のルーチンの提案はありますか?

+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)]。 –

答えて

2

は、内側evalkを引用しないでください。

{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

その2番目の 'eval'は' op ...のフォーマット(op、k))です。 ' –

+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]} 
関連する問題