2017-04-21 6 views
1

私は<word: dictionary>のペアを含むルックアップテーブルを持っています。 その後、単語リストが与えられたら このルックアップテーブルを使って辞書リストを作成できます。 (毎回、この単語リストの長さは固定されていません)。 これらの辞書の値は、いくつかのキーのログ確率を表します。ここでソフトカップルロジックを使用した高速辞書マージ

は例です:単語リストに

['fruit','animal','plant']を考えると

我々は、ルックアップテーブルをチェックアウトし、

dict_list = [{'apple':-1, 'flower':-2}, {'apple':-3, 'dog':-1}, {'apple':-2, 'flower':-1}]を持つことができます。私たちは、キーのセットを持って、リストから見ることができます

:キーごと{'apple', 'flower', 'dog'}

、私はdict_list内の各値の合計を与えたいです。 1つの辞書にキーが存在しない場合は、小さな値-10を値に加えます(-10は非常に小さな対数確率とみなすことができます)。

結果辞書は次のようになります。このコードは動作します

dict_list = [{'apple':-1, 'flower':-2}, {'apple':-3, 'dog':-1}, {'apple':-2, 'flower':-1}] 

key_list = [] 
for dic in dict_list: 
    key_list.extend(dic.keys()) 

dict_merge = dict.fromkeys(key_list, 0) 
for key in dict_merge: 
    for dic in dict_list: 
     dict_merge[key] += dic.get(key, -10) 

、しかしにおけるいくつかの辞書のサイズとします。ここでは

'dog' = (-10) + (-1) + (-10)'flower' = (-2) + (-10) + (-1)'apple' = (-1) + (-3) + (-2)ので、私のpython3コードです 、 dict_merge = {'apple':-6, 'flower':-13, 'dog':-21}dict_listは超大(例えば100,000)であり、実際には許容されない200msを超える可能性がある。

主な計算はfor key in dict_mergeループであり、ループが100,000のループであるとします。

スピードアップソリューションはありますか?ありがとう!そして、読んでいただきありがとうございました〜多分長くて迷惑なこともあります...

P.S. ルックアップテーブルには、大規模な辞書がいくつかあります。だからここにいくつかのチャンスがあるかもしれない。

答えて

2

私が理解できるように、sum(len(d) for d in dict_list)は、len(key_list) * len(dict_list)よりはるかに小さいです。

from collections import defaultdict 

dict_list = [{'apple':-1, 'flower':-2}, {'apple':-3, 'dog':-1}, {'apple':-2, 'flower':-1}] 

default_value = len(dict_list) * (-10) 
dict_merge = defaultdict(lambda: default_value) 
for d in dict_list: 
    for key, value in d.items(): 
     dict_merge[key] += value + 10 
+0

本当に良い答え厥 - あなたは、これは元のアルゴリズムと異なり、なぜそれが最終的に同じ結果に – spacepickle

+0

感謝を生産する方法の詳細を説明することができます!はい、これはより速いです。しかし 'len(dict_list)'は常に3より小さく、最後にはkeys_numberを走査しなければならないので、それほど高速化はしません。 –

+0

@DongxuZhang私は答えを更新しました。今度は、キーを2回反復する必要はありません。 – f1u77y

関連する問題