2010-06-03 3 views
5

PHP에서이 줄은 matches = preg_grep('/^for/', array_keys($hash));이었습니다. $ hash에있는 단어 : 포크, 양식 등을 잡을 수 있습니다.파이썬 dict이 포함 된 자동 완성형 기능

파이썬에서 나는 40 만 단어의 딕트를 가지고있다. 키는 자동 완료 기능 (이 경우 값은 의미가 없습니다)에서 표시하고자하는 단어입니다. 입력과 일치하는 사전에서 어떻게 키를 반환 할 수 있습니까? 내가

my_dic = t{"fork" : True, "form" : True, "fold" : True, "fame" : True} 

을 가지고 있고 일부 입력 "for"을받을 경우 예를 들어

(이전에 사용 된 바와 같이), 그것은 "form", "fork"의 목록을 반환 할 수 있습니다. 그것은 단지 접두사에 대해인지 정규식의

+0

'' '' '' '' '' ''하지 않습니다. – SilentGhost

+0

SilentGhost : 틀림없이 정확하고 편집되었습니다. – tipu

답변

6
>>> mydict={"fork" : True, "form" : True, "fold" : True, "fame" : True} 
>>> [k for k in mydict if k.startswith("for")] 
['fork', 'form'] 

이를 정규 표현식을 사용하는 것보다 빠릅니다 (단어 시작을 찾는 경우에는 충분 함).

1
>>> my_dict = {"fork" : True, "form" : True, "fold" : True, "fame" : True} 
>>> import re 
>>> [s for s in my_dict if re.search('^for', s) is not None] 
['fork', 'form'] 

사용하면 문자열 방법을 사용할 수 있습니다, 당신은 더 복잡한 검색 패턴을 제공 할 수 있기 때문에 더 보편적 : str.startwith, 예를 들면 :

>>> [s for s in my_dict if s.startswith('for')] 
['fork', 'form'] 
0

my_dict.keys()를 사용하여 my_dict에서 키를 가져올 수 있습니다. 그런 다음 각 키를 검색하여 정규 표현식과 일치하는지 확인할 수 있습니다.

m = re.compile('^for') 
keys = [] 
for key in my_dict.keys(): 
    if m.match(key) != None: 
     keys.append(key) 
3

그래서 이것이 당신이 정말 이런 종류의 DICT를 원하지 않는 것 같다 ..

당신이 무엇을 물어 직접 대답하지 않지만, 당신이 찾고있는 나무 같은 구조 요?

그런 다음 입력 된 각 문자 (일정한 시간)에 대해 트리를 탐색하고 트리의 해당 하위 섹션에서 해당 접두어와 일치하는 단어로 나뭇잎을 되돌릴 수 있습니다.

+0

이 특별한 경우는 내가 독트린을 사용하고있는 유일한 시간은 아닙니다. 그것은 역 색인이므로 값은 내가하는 일에 절대적으로 중요한 문서 ID 세트입니다. 내가 딕트를 사용하는 이유는 룩업이 나무보다 훨씬 빠르기 때문입니다 (메모리는 많고 CPU 사이클은 없습니다) – tipu

+0

알려진 키 룩업은 트리 구조보다 dict이 빠를 것이지만 모든 것을 테스트 할 필요가 없지만 부분적으로 일치하는 키는 없습니다. 따라서 미리 키를 모르는 경우 (예 : 위와 같이) 키가 작을수록 트리가 더 좋아집니다. – pycruft

+2

Fyi,이 문제에 대한 완벽한 데이터 구조는 ** trie **라고 불린다. 그러나 파이썬의 stdlib에는 없다. –

1

위에서 설명한 "startswith 3 문자"와 같은 특정 조회 전략을 원할 경우 해당 아이디어를 기반으로 특정 조회 사전을 만들어서 빨리 얻을 수 있습니다.

q = {"fork":1, "form":2, "fold":3, "fame":4} 
from collections import defaultdict 
q1 = defaultdict(dict) 
for k,v in q.items(): 
    q1[k[:3]][k]=v 

이렇게하면 훨씬 작은을 통해 .startswith 유형 조회를 할 수 있도록

def getChoices(frag): 
    d = q1.get(frag[:3]) 
    if d is None: 
     return [] 
    return [ k for k in d.keys() if k.startswith(frag) ] 

전체 40 만 키를 처리하는 것보다 훨씬 더 빨리해야 희망을 설정합니다.