2017-10-27 11 views
0

このプログラムをより効率的にするにはどうすればよいですか?Pythonでネストされたforループを効率的にする

tempPossiblePairs = defaultdict(lambda: set([])) 

    for w1 in words: 
     for w2 in words: 
      if(w1 != w2): 
       tempPossiblePairs[w1].add(w2) 

    for w1 in words: 
     for w2 in words: 

      if(w1 != w2 and (w2 in tempPossiblePairs[w1])): 
       res.append((self.getPMI(w1, w2), self.pair(w1, w2)[0], self.pair(w1, w2)[1])) 

私は(リスト与えられた言葉 ')の値としてキーと組み合わせることができ、キーと単語として単語を取る辞書を生成するプログラムを書きました。次に、単語リストをもう一度見て、それらが等しくないかどうかを確認し、ペア可能(tempPossiblePairs dictを調べることによって)にすることができます。

私はこのコードが混乱し、非効率であることを知っていますが、これをより効率的にするためのヒントを聞きたいと思います。

+2

'tempPossiblePairs'の必要性が表示されません –

+0

次に、w2がキーw1の値であるかどうかを効率的にチェックする方法はありますか? – Dawn17

答えて

1

は、私はあなたが*self.pairビット(これは2つだけelelmentsとpair戻って何かを想定している)タプルにpairの結果を開梱され

from itertools import product 

res = [(self.getPMI(w1, w2), *self.pair(w1, w2)) for w1, w2 in product(words, repeat=2) if w1 != w2] 

にこれを煮詰めることができると思うし、私はそれはあなたを必要だと思いますPython 3の比較的最近のバージョンを持っている

+1

私はあなたのものと同じであることを理解する前に私の答えの半分を得ました。 –

+0

これは標準のpythonパッケージitertoolsですか? – Dawn17

+1

@ Dawn17 yup。あなたが反射を望まないなら、['itertools.product' here](https://docs.python.org/3/library/itertools.html#itertools.product) –

関連する問題