2014-02-09 4 views
0

특정 사전을 정렬하고 top_n 번의 발생 목록을 반환하고 싶습니다. 사전은 txt 파일의 단어 모음으로 '키'는 txt 파일의 한 단어이고 '값'은 문서의 항목 수입니다.큰 값으로 사전 정렬 : 클래스 메서드

def __init__(self:'Collection_of_words', file_name: str) -> None: 
    ''' this initializer will read in the words from the file, 
    and store them in self.counts''' 
    l_words = open(file_name).read().split() 
    s_words = set(l_words) 
    self.counts = dict([ [word, l_words.count(word)] 
         for word 
         in s_words]) 

지금, 내 인스턴스 방법 중 하나는 일부 INT 인수를 포기 사건의 '상위 N'숫자의 문자열 목록을 반환합니다 다음과 같이

은 내가 초기화 방법이있다. 나는 총을 줬다.

그러나 나는이 코드를 실행할 때마다 오류가 발생하고 그 이유를 알 수 없다. 나는 self.counts 이상

+3

방금 ​​연습이 필요하거나 학습 연습으로이 작업을 수행하는 방법을 찾고 있습니까? 더 효율적인 방법으로 이것을 할 수있는 클래스가 있습니다. '콜렉션. 카운터'. –

+0

아니, 나는 컬렉션의 도움을받지 않고 이것을 배우는 연습으로 생각하고있다. 카운터. –

답변

3
sorted(self.counts, key=lambda pair: pair[1], reverse=True) 

순회은 키가 아닌 키 - 값 쌍을 제공 사전 객체 (예. self.counts)을 분류하는 방법을 모르겠어요. 즉, pair[1]이 작동하지 않습니다. key=self.counts.get을 원합니다. collections.Counter 이미 당신이 필요 않습니다, 또한

sorted(self.counts.items(), key=operator.itemgetter(1), reverse=True) 

, 그리고 : 목록이 카운트뿐만 아니라 키를 포함 할 필요가있는 경우

대신 값으로 키 - 값 쌍을 정렬해야합니다 2 차 대신 선형 시간 계산 알고리즘을 사용합니다.

+0

'sorted (self.counts.items(), key = operator.itemgetter (1), reverse = True)'를 사용할 수도 있습니다. 일반적으로 나는 그것을 선호하지만,'get'을 사용하는 키 (원래 호출에서'pair [0]')만을 찾고 있기 때문에 더 명확해질 수 있습니다. –

0

dict_items가 포함 된 변수 '연결'을 생성하여이를 해결했습니다. e.x .:

associations = self.counts.items() 

>>> associations 
>>>dict_items([('would,', 1), ('Even', 1), ('Cries', 1), ('Sings', 5)]) 

다음으로이 변수를 목록 이해에 사용했습니다. 나는 람다 함수를 생성하고 그 쌍의 두 번째 요소를 인덱싱함으로써 연관을 내림차순으로 (가장 큰 것부터 가장 작은 것으로) 정렬했다. 어커런스가 가장 많은 단어는 목록의 색인 [0]에 있습니다.

def top_n_words(self, i): 

    associations = self.counts.items() 

     return [ pair[0] 
      for pair 
      in sorted(associations, key=lambda pair: pair[1], reverse=True)[:i]]