2016-07-21 23 views
0

他の2つの辞書を反復して辞書に入れたいと思う。私は実際の例を持っており、(主にパフォーマンス上の理由から)辞書理解でそれを行う方法があるかどうかを知りたいのですか、それとももっとpythonicにするかを知りたいと思います。まずはコードはPython - ネストされた辞書の理解から辞書を取り込む

def get_replacement_map(dict_A, dict_B, min_sim): 
    replacement_map = {} # the dictionary i want to populate 

    for key_A, value_A in dict_A.items(): 

     best_replacement =() 
     best_similarity = 0 

     for key_B, value_B in dict_B.items(): 

      if key_B[0] != key_A[0]: 

       # similarity(x,y) may return None so in that case assign sim = 0 
       sim = similarity(value_A[0], value_B[0]) or 0 
       if sim > best_similarity and sim > min_sim: 
        best_replacement = key_B 
        best_similarity = sim 

        if sim > 0.9: # no need to keep looking, this is good enough! 
         break 

     if best_replacement: 
      synonym_map[key_A] = best_replacement 

    return replacement_map 

です。これは、2つの辞書の要素間の類似性を計算し、各要素について、可能な限り最良の置換を見つける(類似性がmin_sim閾値を超える場合)。その目的は、置換の辞書を構築することです。

私はPythonには新しいので、これはこれを実装するためのpythonの方法ではないと確信しています。私はループの代わりに補間を使用することでパフォーマンスが大幅に向上したことが分かりました。このコードをネストされた辞書内包表記を使用して実行できるかどうか、またそれが意味があるのか​​どうか不思議でした。

私ができる改善点はありますか?

+0

あなたが 'dict.items()'を使用していることを言及しておきましょう。 Python3では、Python2よ​​りもはるかに優れていますが(http://stackoverflow.com/questions/12543837/python-iterating-over-list-vs-over-dict-items-efficiency)、価値があるかもしれません代わりに 'for key in dict'を使用してdictキーを反復し、' dict [key] 'で値を呼び出すことでパフォーマンスの向上を確認してください。 –

+0

@RNarありがとう、私はそれを試みます。 –

答えて

0

これは、複雑な置換スキーマであり、すべてを1つのライナーに含めると、読みにくいものになります。フローを理解可能にするために必要な構造と間隔を維持することは、これを解決するためのより平凡な方法です。

パフォーマンスの向上に関しては、this質問に記載されているものは表示されない可能性があります。

+0

教育的な推測をするなら、あなたの最高のパフォーマンス向上は 'similarity()'関数の最適化とcythonの使用から来るでしょう – Aaron

+0

あなたは正しいですが、類似性関数はサードパーティのライブラリの関数であり、できます。 –

関連する問題