2013-03-18 2 views
4

확인 목록을 검색, 나는이 코드를 가지고 : 당신이 목록에 그대로 터미널에서 문자열을 입력하는 경우에만파이썬은

colors = ["Red" , "Green" , "Blue" , "Pink" , "Purple" , "Cyan"] 

search = str(raw_input()) 

found = "not" 

if search in colors: 
    print "Found!" 
else: 
    print "not Found" 

지금까지,이 목록에서 한 항목을 찾을 수 있습니다, 즉 문제.

터미널에 하나 또는 두 개의 문자를 입력 할 수 있어야하고 검색과 일치하는 목록 안의 문자열을 나열 할 수 있어야합니다 (예 : 터미널에 "P"를 입력하면 지금까지 내 검색과 일치하기 때문에 "분홍색"과 "자주색"을 나열합니다.

나는 뭔가를 간과하고 있을지 모르지만, 200 라인이 넘지 않아도 이런 식으로 목록을 검색 할 수있는 방법이 있습니까? 코드를 (200 + lines 내가 이것을 구현해야하기 때문에 목록에있는 150 개 이상의 문자열을 가지고 있습니다) 문자열을 검색하기 위해?

+0

Google의 자동 완성과 같은 '추천 검색어'를 묻는 질문이 있으십니까? – squiguy

+0

@squiguy yea, 거의 비슷하게 –

답변

1
search = str(raw_input()) 

matches = [s for s in colors if s.startswith(search)] 

그런 다음 루프 이상 일치 및 인쇄하십시오. 지능형리스트를 사용하여

5

가장 간단한 방법 :

matches = [color for color in colors if color.startswith(search)] 

이 너무 잘 수행 할 수있는 큰 목록이있는 경우.

+1

은 약 200 개의 문자열 (각각 15 자 정도)의 목록을 잘못 작성합니까? –

+0

@RogerParishIII : 시도해보고 성능을 확인하십시오. 이는 코드가 얼마나 빨리 실행되는지를 확인하는 유일한 방법입니다. 이 작업을 수행하는 더 빠른 방법이 있다고 생각하기 때문에 성능 만 언급했습니다. –

+0

고마워,이 완벽하게 작동합니다! –

1
for c in colors: 
     if c[0:len(search)-1] == search: 
      print "Found!" 

절대 가장 우아한 해결책은 아니지만 일을 끝내야합니다. 목록을 반복하고 관련 하위 문자열을 비교하면됩니다. 틀림없이, 검색 문자열이 색상의 어떤 요소보다 길 경우를 대비해 KeyError에 대한 try/catch 블록에서이 태그를 감쌀 수도 있습니다.

2

적절한 데이터 구조가 필요합니다. 귀하의 요구 사항 설명에서, 나는 trie 단지 하나라고 생각합니다.

색 목록으로 trie를 만든 다음 사용자 입력 (접두사 사용 가능)으로 검색합니다. github에서 다양한 구현을 찾을 수도 있고 직접 구현할 수도 있습니다. (: 컬러리스트 작 전은) 성능 문제가 아닌 경우 :

2

그렇지 않으면

colors = ["Red" , "Green" , "Blue" , "Pink" , "Purple" , "Cyan"] 
search = str(raw_input()) 
found = "not" 

for color in colors: 
    # or if color.startswith(search), depend on your needs 
    if search in color: 
     print "Found" 

print "not Found" 

, 트리는를 사용 http://en.wikipedia.org/wiki/Trie

2

당신은 difflib 표준 파이썬 라이브러리를 사용할 수 있습니다.

샘플 코드 :

from difflib import SequenceMatcher 
colors = ["Red", "Green", "Blue", "Pink", "Purple", "Cyan"] 
search = str(raw_input()) 
for color in colors: 
    s = SequenceMatcher(None, search, color) 

    if s.ratio() > 0.25: 
     print color 

출력 :

xxxx$ python foo.py 
p 
Purple 

참고 :

당신은 당신의 요구에 따라 경기 비율을 조작 할 수 있습니다. 여기 마이닝 패턴에 .25 이상의 비율을 사용했습니다.

2

정규식을 사용하면 텍스트의 양과 일치시킬 부분을 결정할 수 있습니다. 다음은 문자열의 시작 부분 만 검색합니다.

import re 

colors = ["Red" , "Green" , "Blue" , "Pink" , "Purple" , "Cyan"] 
search = re.compile("^"+str(raw_input())) 
isthere=[] 
for col in colors: 
    if search.findall(col)!=[]: 
     isthere.append(col) 

if isthere==[]: 
    print "Nothing there" 
else: 
    print isthere