2014-11-19 2 views
1

두 개의 별도의 Excel 통합 문서에서 추출한 두 목록 목록이 있습니다. 각 요소는 자체 요소 두 개를 포함합니다. 이 목록은 각 Excel 통합 문서의 처음 두 열에있는 데이터를 나타냅니다. 예를 들면 :비교 파이썬/xlrd 두 별도의 시트에서 Excel 데이터를 비교

search_terms = [['term1',300],['term2',400],['term3',200]...] #words searched on our website with number of hits for each 
item_description = [[900001,'a string with term1'],[900002,'a string with term 2'],[900003,'a string with term 1 and 2']...] #item numbers with matching descriptions 

내 목표는 item_descriptions의 문자열로 SEARCH_TERMS의 문자열을 비교하고, 각 검색어에 대한 ITEM_DESCRIPTION에서 항목 번호와 일치의 목록을 컴파일하는 것입니다. 그런 다음 생성하는 히트 양을 기준으로 상위 250 개 용어와 일치하는 항목 번호를 가져오고 싶습니다.

나는 xlrd에서 두 목록을 생성하고 난 다음과 같은 목록을 생성하는 튜플로 변환하고 작업 할 것입니다 생각 :

results = [['term1',300,900001,900003],['term2',400,900002,900003],['term3',200]] #search term, number of hits, and matching item numbers based on item description 

그때 인접 항목 번호를 작성합니다을 xlwt를 사용하여 표시/프리젠 테이션 목적으로 파일을 Excel에서 비교합니다.

파이썬, xlrd 및 프로그래밍과 관련하여 나는 초록색입니다. 나는 나의 접근 방식과 관련하여 나의 순진함에 대한 민감성과 함께 어떤 입력과 방향에 감사 드린다.

답변

0

당신은 올바른 길을 가고 있습니다.하지만 여기서 원하는 것은 isntead라는 용어가 키라는 용어와 값의 목록 인 사전입니다.

{ 
    'term1': [300, 900001,900003], 
    'term2': [400,900002,900003], 
    'term3': [200] # are there numbers missing from this one? 
} 

여기이에 대한 코드의 모습은 다음과 같습니다 : 이런 식으로 뭔가를 찾고 끝낼 것이다 키가 이미 사전에있는 경우

import re 
from collections import defaultdict 

search_terms = [['term1',300],['term2',400],['term3',200]] #words searched on our website with number of hits for each 
item_description = [[900001,'a string with term1'],[900002,'a string with term2'],[900003,'a string with term1 and term2']] 

d = defaultdict(list) 
i = 0 

for item in search_terms: 
    d[item[0]].append(item[1]) 
    rgx = re.compile(item[0]) 
    for info in item_description: 
     matches = re.findall(rgx, info[1]) 
     if matches: 
      d[item[0]].append(info[0]) 
     print matches 
print d 

Defaultdict 테스트를, 그렇지 않은 경우 추가합니다. 그런 다음 사전을 반복하여 키를 첫 번째 열에 넣은 다음 목록을 반복하여 각 열을 자신의 열에 넣습니다. 이 정보가 귀하의 데이터 구조에 맞지 않는 경우 알려 주시면이를 시도하고 조정할 수 있습니다.

+0

키워드 (이 경우 'term3')가 item_description에 없으므로 결과 [2]에 900000 번호를 넣지 않았습니다. 이것은 제가 찾고있는 접근 방법과 같습니다. 나는 그것으로 국수를 먹을 것이다! 지금까지 도움을 주셔서 감사합니다! – shatenfreude

+0

부분 검색이 검색됩니까? 예를 들어, 용어는 '사과'이고 설명은 '사과가 들어있는 제품'이며 품목 번호는 900001입니다.이 문자열은 부분 일치 문자열 (사과/사과 및 단순히 사과). 지금까지 도와 주셔서 감사합니다! ** 편집 ** 잘, nm, 그냥 사용중인 정규 표현식 연산을 찾았습니다. 이것은 내가하고 싶은 멋진 코드입니다! 고맙습니다! – shatenfreude

+0

예! re.findall (pattern, string)은 모든 하위 문자열을 찾아 목록에 배치합니다. 단어의 시작 부분이나 끝 부분에서만 하위 문자열을 찾으려면^(단어 시작) 및 $ (단어 끝) 한정자를 사용하십시오. – ekrah