2017-09-23 50 views
1

キー全体の値の各要素について簡単な要約統計(平均)を実行するには、辞書全体を繰り返し処理するのに問題があります。Python - dict内の各キーの平均値

私の辞書には、番号のリストであるキーと値で構成されています

test_dict={'NJ':[20,50,70,90,100],'NY':[10,3,0,99,57],'CT':[90,1000,2,3.4,5]} 

私は以下のことにより、例えば、各キーの最初の値にアクセスできることを知っているが、私は問題を抱えています次のforループを追加して、値のすべての要素を反復処理するという明白な次のステップを実行します。

location1=[element[0] for element in test_dict.values()] 
location1_avg=sum(location1)/len(location1) 

私の究極の目標は、ラベル(場所1 ... i)とその場所の状態の平均値を持つ辞書を持つことです。したがって、最初のKey-ValueはLocation1:40などとなります。

私は以下のような試みをしていますが、エラーメッセージは 'リストのインデックスが範囲外です'です。この場合、正しく反復する方法がわかりません。

for element in test_dict.values(): 
    avg=list() 
    for nums in element[i]: 
     avg[i]=sum(element[i][nums])/len(element[i][nums]) 

要求

soln_dict={'Location1':40,'Location2':351,'Loction3':24,'Loction4':43.24,'Loction5':54} 

あたりの所望の出力を追加するあなたの助けをありがとう!

+1

'test_dict'が与えられた場合、結果として期待されるものを正確に表示できますか? – mkrieger1

+0

@ Jean-FrançoisFabre私は40が20、10、90の平均であると思われるので、3つのキーを持つ辞書ではなく、5つの数字のリストが望ましい結果になることがあります。 – mkrieger1

+0

あなたが正しいです - 望ましい出力は5つのキーと値のペアを持つ辞書です。最初のものは場所1になります: –

答えて

1

ちょうど行います

#loop through the dictionary 
for key,value in test_dict.items(): 

    #use reduce to calculate the avg 
    print(key, reduce(lambda x, y: x + y, test_dict[key])/len(test_dict[key])) 

はこれが印刷されます:

NJ 66.0 
NY 33.8 
CT 220.08 

を編集:変更ごとに私はnはOPの要件:

l = list(iter(test_dict.values()))      #convert values to list 
print(l) 
#[[20, 50, 70, 90, 100], [10, 3, 0, 99, 57], [90, 1000, 2, 3.4, 5]] 
d={}                 #final ditionary 
for i in range(len(l[0])): 
    row_list = [row[i] for row in l]      #get values column-wise 
    d['location'+str(i+1)] = sum(row_list)/len(row_list)    #calculate avg 

print(d) 
#{'location1': 40.0, 'location2': 351.0, 'location3': 24.0, 'location4': 64.13333333333334, 'location5': 54.0} 

注:loaction4のために、質問に入れている平均が間違っています。

+0

ありがとうございます - 私の本当の願いは、今以上に説明したように、各値の最初の要素のそれぞれについて平均を求めることです。希望の出力を参照してください - あなたの助けに感謝します。 –

+1

@Tony、編集を確認してください –

+0

このソリューションに関する私の予約は、データをループするために整数インデックスを使用しています。これはPythonicではありません。しかし、それは動作し、効果的に質問に答えます。 – fralau

1

iはどこにあるのか分かりませんが、「有用でない/有害なインデックスを使用する」ための使い捨てプレゼントです。

あなたの問題は、ストレート、入力/出力データストリームを持ち、その値として平均値と辞書をキー、値に反復する、辞書の理解を使用して再構築のために完璧にマッチです:

test_dict={'NJ':[20,50,70,90,100],'NY':[10,3,0,99,57],'CT':[90,1000,2,3.4,5]} 

result = {k:sum(x)/len(x) for k,x in test_dict.items()} 

print(result) 

が得られます。

{'CT': 220.08, 'NJ': 66.0, 'NY': 33.8} 

EDIT:

result = {"location{}".format(i):sum(v)/len(v) for i,v in enumerate(zip(*test_dict.values()),1)} 
:あなたは、その場合には、単に値のzip形式のバージョンを使用し、匿名化キーで「転置」バージョンをしたいように見えます

います:

{'location3': 24.0, 'location5': 54.0, 'location1': 40.0, 'location2': 351.0, 'location4': 64.13333333333334} 
+0

ありがとうございます - それはそれを行う良い方法です。しかし、私の望む出力は、値の各要素のキーを平均化することです。希望する出力を編集してください。 –

+0

私の更新されたソリューションを確認してください。まだ1ライナー –

1

あなたがこれを行うことができます:

test_dict={'NJ':[20,50,70,90,100],'NY':[10,3,0,99,57],'CT':[90,1000,2,3.4,5]} 
avg=[sum(element)/len(element) for element in test_dict.values()] 
print(avg) # => [66.0, 33.8, 220.08] 

と辞書のため:編集した質問への

test_dict={'NJ':[20,50,70,90,100],'NY':[10,3,0,99,57],'CT':[90,1000,2,3.4,5]} 
avg={ k:sum(test_dict[k])/len(test_dict[k]) for k in test_dict} 
print(avg) # => {'NJ': 66.0, 'NY': 33.8, 'CT': 220.08} 

回答:

た場合を配列は常に5の長さを持って、この使用:

test_dict={'NJ':[20,50,70,90,100],'NY':[10,3,0,99,57],'CT':[90,1000,2,3.4,5]} 
avg={} 
for i in range(5): 
    avg['Location'+str(i+1)] = sum(test_dict[k][i] for k in test_dict)/len(test_dict) 
print(avg) 

出力:

{'Location1': 40.0, 'Location2': 351.0, 'Location3': 24.0, 'Location4': 64.13333333333334, 'Location5': 54.0} 
+0

ありがとう、あなたの助けに感謝します。希望の出力は実際には異なっています - 私は元のポストでそれをより良く説明しました。 –

+0

@Tony配列の長さは常に固定されていますか? –

+0

この場合、はい。 –

1

できるだけそれをシンプルに保つために、私は私がお勧めします:

from statistics import mean 

test_dict={'NJ':[20,50,70,90,100],'NY':[10,3,0,99,57],'CT':[90,1000,2,3.4,5]} 

# put the data in a list of lists 
# (throw away the city names) 
l = [seq for seq in test_dict.values()] 


# put together 1st values, 2nd values, etc. 
r = [mean(i) for i in zip(*l)] 
print(r) 

与える:

[40, 351, 24, 64.13333333333334, 54] 

私が征服する分割:私はリストのリストにこの辞書を回して、 zipを使用して「列」をまとめました。 zipは引数ではなくコンマで区切られているので、私はスター演算子(*)を使って変換を行いました。

場所のリストを取得する必要がありますか?それはちょうどLocation_ +インデックス番号ですか?

平均的な機能については、statisticsパッケージ(Python> 3.4の場合)を参照してください。それ以外はあなた自身で書くことができます:

mean = lambda l: reduce(lambda x, y: x+y, l)/len(l) 

私はFinding the average of a listからインスピレーションを受けました。 そのはおそらく少しわかりにくいので、reduceを付けずに関数を書く方がはっきりしているかもしれませんが、1つのライナーで簡単にコピー&ペーストできます。

あなたがPython 3の場合、をfunctoolsからインポートしてください。

+0

ありがとうございます - 私の本当の願いは、今以上に説明したように、各値の最初の要素のそれぞれについて平均を求めることです。希望の出力を参照してください - あなたの助けに感謝します。 –

+0

ああ。それはさらに簡単です。私は私の答えを変更します。 – fralau

+0

ありがとうございます。 –

関連する問題