2016-12-04 9 views
2

以下の例のようなタプルのリストがあります。どうすればリストを見て、同じ略語を見つけてスコアを追加することができますか?すべての略語に対してこれを実行できるようにしたい。タプルのリストにある同様の値を比較する

loop = [('MD', 0.0), ('MD', 0.0), ('MD', 0.0), ('LA', 0.0625), ('LA', 0.0625), ('CA', -0.5), ('CA', -0.5), ('CA', -0.5))] 

答えて

5

あなたが平均取得するにはitertools.groupby()

>>> from itertools import groupby 
>>> loop = sorted(loop, key = lambda x:x[0]) 
>>> {k:sum(list(e[1] for e in v)) for k, v in groupby(loop, lambda x:x[0])} 
{'MD': 0.0, 'CA': -1.5, 'LA': 0.125} 
>>> 

でそれを行うことができ、以下で上記のコードを置き換える:あなたは別の解決策としてCounterを使用することができます

>>> result = dict() 
>>> for k, v in groupby(loop, lambda x:x[0]): 
...  temp = list(v) 
...  result[k] = sum(i[1] for i in temp)/len(temp) 
... 
>>> result 
{'MD': 0.0, 'LA': 0.0625, 'CA': -0.5} 
>>> 
+0

天才、ありがとうございます! –

+1

速度は問題ではないと思っていますが、ここでのlog(n)オーバーヘッドは少し不必要なようです。 –

3

。このアプローチは、O(n)時間の複雑さに関する問題を解決する。

from collections import Counter 

loop = [('MD', 0.0), ('MD', 0.0), ('MD', 0.0), ('LA', 0.0625), ('LA', 0.0625), ('CA', -0.5), ('CA', -0.5), ('CA', -0.5)] 
c = Counter() 
for k, v in loop: 
    c[k] += v 

print(c) 
# Counter({'LA': 0.125, 'MD': 0.0, 'CA': -1.5}) 
print(dict(c)) 
# {'LA': 0.125, 'CA': -1.5, 'MD': 0.0} 
+0

あなたが作成した合計をいくつのエントリがあるかで除算する方法はありますか?平均を取得しようとしています。 –

+0

別のカウンタを使用して、各アイテムのオカレンス数を取得できます。単純に 'c2 [k] + = 1'のようになります。 – amin

+0

ありがとうございました! –

関連する問題