2017-10-27 2 views
0

어떻게이 프로그램을보다 효율적으로 만들 수 있습니까? 중첩 된 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 비트 (이것은 단지 두 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

itertools는 표준 파이썬 패키지입니까? – Dawn17

+1

@ Dawn17 예. 반향을 원하지 않는다면 [itertools.product' here] (https://docs.python.org/3/library/itertools.html#itertools.product) –

관련 문제