2013-06-13 3 views
1

다음 파일에 500.000 줄이 넘습니다. 선이 다음과 같이 각 튜플빠른 방법으로 사전 만들기 - Python

0-0 0-1 1-2 1-3 2-4 3-5 
0-1 0-2 1-3 2-4 3-5 4-6 5-7 6-7 
0-9 1-8 2-14 3-7 5-6 4-7 5-8 6-10 7-11 

, 첫 번째 숫자는 텍스트 동일한 라인 N하지만상의 워드의 인덱스 라인 N 문자 A의 두 번째 자리 워드의 인덱스를 나타낸다 비. 또한 텍스트 a의 동일한 단어가 텍스트 b의 여러 단어에 연결될 수 있음을 지적 할 가치가 있습니다. 인덱스 0의 라인의 경우와 같이, 텍스트 a의 위치 0에있는 단어는 텍스트 b의 위치 0과 1에있는 두 단어에 연결됩니다. 이제 텍스트의 어느 단어가 텍스트의 어느 단어에 연결되어 있는지 쉽게 검색 할 수 있도록 위의 행에서 정보를 추출합니다. b. 내가 생각하는 다음 코드와 같이 사전을 사용하고 있습니다 :

#suppose that I have opened the file as f 
for line in f.readlines(): 
    #I create a dictionary to save my results 
    dict_st=dict() 
    #I split the line so to get items like '0-0', '0-1', etc. 
    items=line.split() 
    for item in align_spl: 
     #I split each item at the hyphen so to get the two digits that are now string. 
     als=item.split('-') 
     #I fill the dictionary 
     if dict_st.has_key(int(als[0]))==False: 
      dict_st[int(als[0])]=[int(als[1])] 
     else: dict_st[int(als[0])].append(int(als[1])) 

모든 텍스트에서 단어의 대응과 관련 infromation 추출 후, 나는 다음 서로 정렬 된 단어를 인쇄 할 수 있습니다. 이제이 방법은 매우 느립니다. 특히 500,000 개가 넘는 문장에서 반복해야한다면 더욱 그렇습니다. 나는이 정보를 추출하는 더 빠른 방법이 있는지 궁금해하고 있었다. 감사합니다.

+1

'has_key'를 사용하지 말라. 'int (als [0])가 dict_st :에 없으면'괜찮습니다. –

+1

'align_spl'이란 무엇입니까? –

답변

3

안녕하세요이 당신은 각 라인에 대한 사전을해야 할 경우 당신은

을 필요한 것을하지 확신 :

당신은 전체 파일 사전을해야하는 경우
for line in f: 
    dict_st=dict() 
    for item in line.split(): 
     k, v = map(int, item.split('-')) 
     dict_st.setdefault(k, set()).add(v) 

:

dict_st={} 
for line in f: 
    for item in line.split(): 
     k, v = map(int, item.split('-')) 
     dict_st.setdefault(k, set()).add(v) 

I 값 반복을 방지하기 위해 list 대신 set을 사용했습니다. 이러한 반복이 필요한 경우 '목록'을 사용하십시오.

dict_st={} 
for line in f: 
    for item in line.split(): 
     k, v = map(int, item.split('-')) 
     dict_st.setdefault(k, []).append(v) 

N.B. 하나는 메모리에서 읽지 않고 파일을 반복 할 수있다. readlines()

+2

'defaultdict (set) '을 사용하면 더 낫습니다. 또한'for line in f :'는 전체 파일을 한번에 메모리로 읽을 필요가 없습니다. –

+0

예. 죄송합니다. 나는이 줄을 복사했고'readlines()'을 발견하지 못했다. – oleg