2013-03-10 4 views
0

저는 현재 단어 색인을 만들고 텍스트 파일에서 각 행을 읽고 해당 단어가 해당 줄에 있는지 확인하려고합니다. 그렇다면 숫자 라인을 출력하고 점검을 계속합니다. 나는 각 단어와 줄 번호를 인쇄 할 때 어떻게하고 싶었는지 알기 위해 노력했지만, 각 번호를 포함하기 위해 사용할 수있는 저장 시스템을 모르겠습니다.단어 색인 만들기

코드 예제 :

def index(filename, wordList): 
    'string, list(string) ==> string & int, returns an index of words with the line number\ 
    each word occurs in' 
    indexDict = {} 
    res = [] 
    infile = open(filename, 'r') 
    count = 0 
    line = infile.readline() 
    while line != '': 
     count += 1 
     for word in wordList: 
      if word in line: 
       #indexDict[word] = [count] 
       print(word, count) 
     line = infile.readline() 
    #return indexDict 

이 카운트 시간 (줄 번호)에 무엇이든 단어 및 인쇄,하지만 난 할 노력하고있어 나중에 것을 나는 할 수 있도록 번호를 저장할 수있다 그것 출력한다

word linenumber 

word2 linenumber, linenumber 

등등. 나는 각각의 키가 하나 개 이상의 값을 포함 할 수있는 목록 내에서 각 행 번호를 넣어 경우 사전이 작동 것이라고 생각하지만, 내가 가진 가장 가까운이 있었다 :

{'mortal': [30], 'dying': [9], 'ghastly': [82], 'ghost': [9], 'raven': [120], 'evil': [106], 'demon': [122]} 

나는 그것이로 표시하고 싶어 :

{'mortal': [30], 'dying': [9], 'ghastly': [82], 'ghost': [9], 'raven': [44, 53, 55, 64, 78, 97, 104, 111, 118, 120], 'evil': [99, 106], 'demon': [122]} 

어떤 아이디어가? 이 같은

+1

아마도 새 키에 대해 기본값 [a]을 지정하고 추가하는 defaultdict가 필요합니다. 주석 처리 된 행은 물론 매번 1- 항목 목록으로 키를 다시 작성합니다. – geoffspear

+0

답변 해 주신 모든 분들께 감사드립니다. 매우 감사하게 생각합니다. – iKyriaki

답변

2

당신은 당신이 원하는 답을 얻을 것입니다

indexDict[word] = indexDict.setdefault(word, []) + [count] 

에이 라인을 변경

indexDict[word] = [count] 

하여 이전 값을 대체하고있다. indexDict [word]의 현재 값을 얻고 새로운 count를 추가합니다. indexDict [word]가 없으면 빈 목록을 새로 추가하고 count를 추가합니다.

+0

이것은 실제로 내가 필요한 것입니다. 고맙습니다. – iKyriaki

+2

@iKyriaki :'defaultdict' 솔루션은보다 간단한 구문으로 동일한 작업을 수행합니다. –

+0

NP. 사전을 선택하므로 사전 방법을 사용하여 도움을받을 수 있습니다. 왜 어떤 사람들은 콜렉션을 사용하여 코드를 다시 작성하는지 이해할 수 없습니다. – octref

3

시도 뭔가 :

import collections 
def index(filename, wordList): 
    indexDict = collections.defaultdict(list) 
    with open(filename) as infile: 
     for (i, line) in enumerate(infile.readlines()): 
      for word in wordList: 
       if word in line: 
        indexDict[word].append(i+1) 
    return indexDict 

이 (포우의 까마귀 사용) 귀하의 예제에서와 동일한 결과를 얻을 수 있습니다.

또는 defaultdict 대신 일반 dict을 사용하고 목록의 모든 단어로 초기화하는 것이 좋습니다. 텍스트에없는 단어에 대해서도 indexDict에 항목이 있는지 확인하십시오.

또한 enumerate의 사용에 유의하십시오. 이 기본 제공 함수는 일부 목록의 해당 색인에있는 색인 및 항목 (파일의 행과 같은)을 반복하는 데 매우 유용합니다.

+1

줄 번호의 경우 0 대신 1부터 시작하는 것이 좋습니다. 'enumerate (infile, 1)', 나중에 하나의'.append (i)' –

2

가이를 작성하는보다 파이썬 방법은 아마도,하지만 단지 읽기 쉽이 (간단한 예제) 시도해 볼 수도 있습니다 : 목록이있는 경우, 당신은 목록에 다음 항목을 추가 할 필요가

dict = {1: [], 2: [], 3: []} 

list = [1,2,2,2,3,3] 

for k in dict.keys(): 
    for i in list: 
     if i == k: 
      dict[k].append(i) 


In [7]: dict 
Out[7]: {1: [1], 2: [2, 2, 2], 3: [3, 3]} 
+0

으로 이렇게 할 수 있습니다. 이것은 라인 번호가 아닌 _lines_를 추가합니다! –

+0

숫자를 사용하여 로직을 보여 주려고했지만, 이미 추가 할 라인 인덱스 값이 있다고 생각했습니다. "count + = 1". 라씨. –

1

을 이미 존재 함. 내가 단순화했습니다

from collections import defaultdict 

def index(filename, wordList): 
    indexDict = defaultdict(list) 
    with open(filename, 'r') as infile: 
     for i, line in enumerate(infile): 
      for word in wordList: 
       if word in line: 
        indexDict[word].append(i) 
        print(word, i) 

    return indexDict 

:

이미 심지어 당신이 단어를 찾아 처음으로가 목록을 가지고하는 가장 쉬운 방법은, 워드 - 투 - 라인 매핑을 추적하기 위해 collections.defaultdict class을 사용하는 것입니다 모범 사례를 사용하여 코드를 조금만 수정하십시오. 컨텍스트 관리자로 파일을 열면 완료되면 자동으로 닫히고 enumerate()을 사용하여 즉시 행 번호를 만듭니다.

회선을 단어 집합 (아마도 set(line.split())이지만 구두점은 제거하지 않음)으로 바꾸면 속도를 조금 더 높일 수 있고 (더 정확하게 만들 수 있습니다), 교차로를 사용할 수 있습니다. wordList (또한 세트)에 대한 테스트. 일치하는 단어를 찾는 데 훨씬 빨라질 수 있습니다.

+0

'count' 변수에 어떤 변화가 있습니까? htis :'indexDict [word] .append (count) '이'indexDict [word] .append (i)'여야합니까? 그리고 '입술'이란 무엇입니까? – hughdbrown

+0

또한,'defaultdict'에 대해 언급하는 유일한 사람이 될 것이라면, 인스턴스를 계산하는 것이 아이디어인지를 알기에 OP의 유스 케이스를 충분히 이해하지 못하더라도'collections.Counter'라고 언급 할 수도 있습니다. – hughdbrown

+0

잘못된 편집; 그 오류를 지적 주셔서 감사합니다. 나는 '반대자'에 대해 언급하는 것을 고려했지만 그것을 기각했다. 그것의 API는이 유스 케이스에 대한 과잉이다. –