2013-07-09 2 views
2

지금 나는 다음과 같은 목록을 비교 할 필요가 일부 파이썬 코드를 쓰고 있어요에서 용어를 검색하기 : 지금까지파이썬 - 가장 빠른 방법은 목록을 비교하고 목록

small_list = ["string"]*3 
big_list = ["string"]*600000 
big_list_excludes = ["string"]*600000 

final_lines = [] 

for small in small_list: 
    final_lines = [line for line in big_list if small in big_list] 
    for exclude in big_list_excludes: 
     final_lines = [line for line in final_lines if exclude not in final_lines] 

를,리스트의 천국 아주 컸다. 실행이 두 번째로 분할되었습니다. 그러나 big_list는 이제 약 60,000 개의 항목을 포함 할 수 있으며 'big_list_excludes'도 가능합니다. 누구든지 위를 단축하는 방법을 알고 있으므로 더 빠릅니다. 또한 누구나 실행 속도를 높이는 목록 외에도 사용할 수있는 다른 데이터 유형을 알고 있습니까? 이 목록에 추가해야하지만 주문을 변경할 필요는 없습니다.

또한 이러한 목록 비교는 대소 문자를 구분하지 않는 것이 좋습니다. 이전에 나는 다음과 같이함으로써 이것을 수행했다 :

for small in small_list: 
    for line in big_list: 
     if small.upper() in line.upper(): 
      final_lines.append(line) 

나는 이것이 속도를 많이 줄인다는 것을 확신한다. 더 효율적으로 그렇게하는 방법을 아는 사람이라면 도움이 될 것입니다.

+0

목록의 모든 항목이 고유합니까? 그렇다면 당신은 교차점과 차이점을 찾고 있기 때문에 세트를 사용할 수 있습니다. –

+0

그들은 이론적으로 고유해야합니다 ... 그러나 실제 보장은 없습니다. 중복을 갖는 것이 가능합니다. – SheerSt

+0

중복을 보존해야합니까? 아니면 'abc'가'small_list'와'big_list' 둘 다에 존재한다는 사실입니까? 중복이있는 목록에서 집합을 만들면 여분의 중복이 제거됩니다. –

답변

2

세트를 사용하면이 작업을 신속하게 수행 할 수 있습니다. 아니 진정한 성능 테스트,하지만이 작은 프로그램은 10,000 항목의 세트로 (A 2.7GHz의의 I7 아이맥에) 즉시 실행 :

from sets import Set 

inc = set(open('big_list.txt').read().splitlines()) 
excl = set(open('big_list_excludes.txt').read().splitlines()) 
sm = set(open('small_list.txt').read().splitlines()) 

sm.intersection_update(inc) 
sm.difference_update(excl) 

print sm 

하지만, 대소 문자를 구분하지 않습니다.

+0

'iter (open (filename)) '을 호출하고 줄을 반복 할'set (open ('big_list.txt '))'를 사용합니다. 이렇게하면 전체 파일을 문자열. 대소 문자를 구별하지 않으려면,'set (open (line) '('big_list.txt '))'에 대해 set (open (line.lower))보다 좋은 방법을 생각할 수 없습니다. –

+1

'set (open ('big_list.txt'))'에 동의하십시오. (다른 스크립트에서 복사하여 붙여 넣을 때 일어나는 일입니다!) 대소 문자를 구분할 때 테스트 할 것은 위에서 제안한 방법 또는 교차 및 대소 문자를 구분하여 처리 한 다음 결과를 소문자로 만들고 중복 된 부분을 제거하십시오. –

관련 문제