2017-11-14 3 views
2

많은 수의 열과 오브젝트 ID가있는 오브젝트 묶음에 대한 정보가 서로 다른 두 개의 파일이 있습니다. 두 파일의 일치 항목을 찾아야하지만 오브젝트 ID는 두 가지 형식으로 나타납니다.python에서 일치하는 항목 찾기

12-12-1은 하나의 파일에 00120012121로 쓰여집니다. 예를 들어, 하나 개의 파일에 내가 가진 :

다른이에 해당
0001 01531 1 
0001 01535 1 
0001 01538 1 

: 트릭을 할 것 같지 않습니다

matches = open('matches.dat','w') 
for j in range(len(file1)): 
    for i in range(len(file2)): 
     if file1[j] == file2[i]: 
      matches.write('{}/n'.format(file1[j])) 

만큼 간단

1-1531-1 
1-1535-1 
1-1538-1 

뭔가 .

여기서 file1 및 file2는 다른 파일의 모든 개체 ID를 포함하는 목록입니다.

일치 항목을 찾으려면 내 코드에 무엇을 추가해야합니까?

+0

가 되세요 숫자를 0으로 채우는 방법은 https://stackoverflow.com/questions/339007/nicest-way-to-pad-zeroes-to-string을 참조하십시오. '1-1531-1'형식의 데이터를 다른 형식으로 변환하려고 할 것입니다. (아마 .split() 사용) –

답변

1

번째로 제 1 포맷 변환 :

import re 

def convert(word): 
    word = word.strip().replace(' ', '-') 
    return re.sub('\\b0+', '', word) # strip all 0s after a word boundary (space or beginning of line) 

알고리즘 개선

사용자가리스트에 모두 변환 교차

를 계산하여 (N + m) 시간을 O의 교차점을 계산할 수

file1_ids = {convert(line) for line in file1} 
file2_ids = {line for line in file2} 

matches = file1_ids.intersection(file2_ids) 
0

몇 가지 참고 사항 :

- 당신이 당신의 경기를 닫지 마십시오 코드 끝 부분에 파일이 있습니다. with을 사용하면 자동으로 파일 정리가 처리됩니다.

- 코드의 마지막 줄에있는 개행 문자가 올바르게 이스케이프 처리되지 않았습니다. \n이 아니고 /n이 아닙니다.

당신의 숫자 형식이 항상 일정 인 경우는,이 ​​작동합니다 (첫 번째 열에는 항상 네 개의 값으로 채워집니다 즉, 두 번째는 항상 5 패딩, 마지막은 결코 패딩입니다) :

with open('matches.dat', 'w') as matches: 
    for j in range(len(file1)): 
     for i in range(len(file2)): 
      match_list = file2[i].split('-') 
      match_str = '{} {} {}'.format(match_list[0].zfill(4), match_list[1].zfill(5), match_list[2]) 
      if file1[j] == match_str: 
       matches.write('{}\n'.format(file1[j])) 
관련 문제