以下の例のようなタプルのリストがあります。どうすればリストを見て、同じ略語を見つけてスコアを追加することができますか?すべての略語に対してこれを実行できるようにしたい。タプルのリストにある同様の値を比較する
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))]
以下の例のようなタプルのリストがあります。どうすればリストを見て、同じ略語を見つけてスコアを追加することができますか?すべての略語に対してこれを実行できるようにしたい。タプルのリストにある同様の値を比較する
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))]
あなたが平均取得するには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}
>>>
。このアプローチは、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}
あなたが作成した合計をいくつのエントリがあるかで除算する方法はありますか?平均を取得しようとしています。 –
別のカウンタを使用して、各アイテムのオカレンス数を取得できます。単純に 'c2 [k] + = 1'のようになります。 – amin
ありがとうございました! –
天才、ありがとうございます! –
速度は問題ではないと思っていますが、ここでのlog(n)オーバーヘッドは少し不必要なようです。 –