2017-04-14 1 views
0

전 국가 코드 목록을 사용하여 N 개의 우편 번호 목록을 명명하는 no-SQL 솔루션을 개발하기 위해 노력하고 있습니다.파이썬에서의 빠른 검색 - 우편 번호

{ 'Belowra': 지금까지 내가 형태로 NSW의 상태에 대한 내 참조 사전이 2545, 'Yambulla'2550 'Bingie'2537 ... [N = 4700]

내 함수는 우편 번호의 이름을 조회하려면이 옵션을 사용하여 N이 충분히 큰 경우 작은 목록에 대한 확인

def look_up_sub(pc, settings): 
    output=[] 
    for suburb, postcode in postcode_dict.items(): 
     if postcode == pc and settings=='random':#select match at random 
      print(suburb)      #remove later 
      output.append(suburb) 
      break        #stop searching for matches 
     elif postcode == pc and settings=='all': #print all possible names for postcode 
      print(suburb)      #remove later 
    return output 

N=[2000,2020,2120,2019] 
for i in N: 
    look_up_sub(i, 'random') 

>>>Millers Point 
>>>Mascot 
>>>Westleigh 
>>>Banksmeadow 

동안은,이 비효율적 인 접근 방식이 매우 느립니다. 나는이 작업을 상당히 가속화하기 위해 numpy 배열을 사용하는 방법에 대해 생각 해왔고 이것을 접근하는 더 빠른 방법을 찾고있다.

+1

왜 일치 항목을 찾으려면 * 사전을 반복 하시겠습니까? 그 점을 모두 무시하면 튜플 목록을 얻을 수 있습니다. 데이터 구조가 거꾸로되어'postcode : suburb'에서 시작해야합니다. 그러면'pc'를 전달하면 교외리스트를 얻은 다음 그 목록에서 무작위로 선택하거나 목록에있는 모든 것을 인쇄하십시오. –

+0

동의! 사전의 아름다움은 O (1) 룩업을 반복하면서 그 점을 되풀이합니다. –

+0

덕분에 확실히 도움이되었습니다. 'postcode_dict = dict (우편 번호, 우편 번호) print (postcode_dict [2000])' – lm5050

답변

0

데이터 구조가 거꾸로되어 있으므로 postcode:suburb에서 시작해야합니다. 그런 다음 PC에 전달하면 다시 교외 목록을 얻은 다음 해당 목록에서 임의로 선택하거나 목록에서 모두 인쇄하십시오. 여기 당신이 당신의 DICT를 먼저 수행 반대한다 무엇 :

이제
import defaultdict 
post_to_burb = defaultdict(list) 
for suburb, postcode in postcode_dict.items(): 
    post_to_burb[postcode].append(suburb) 

, 뭔가를해야 할 함수 :

import random 
def look_up_sub(pc, settings): 
    output = [] 
    if settings == "random": 
     output.append(random.choice(post_to_burb[pc])) 
    elif settings == 'all': 
     output.extend(post_to_burb[pc]) 
    return output 

작업중인 특히 이후, unweildy 것 여기 NumPy와 사용 문자열. 당신은 런타임에서 약간의 imporvemnt를 얻을 수도 있지만 전체 알고리즘은 여전히 ​​선형 시간입니다. post_to_burb dict을 설정하면 이제 일정 시간입니다.

+0

나는 뭔가를했습니다. 비슷한 결과가 나왔고 약 47534 개의 우편 번호 목록에 대한 결과가 나왔습니다. 다시 한 번 감사드립니다. – lm5050

0

빌드 우편 번호에서 교외에 DICT : 그 짓으로

from collections import defaultdict 
code_to_urbs = defaultdict(list) 
for suburb, postcode in postcode_dict.items(): 
    code_to_urbs[postcode].append(suburb) 

, 당신은 단지 code_to_urbs[postal_code]을 작성할 수 있습니다.