2015-12-05 2 views
1

Я пытаюсь прочитать текстовый файл, а затем распечатать все слова с самыми частыми словами сверху, уменьшаясь по мере того, как он идет по списку. У меня Python 3.3.2.python word counter w/sorted frequency

def wordCounter(thing): 
# Open a file 
    file = open(thing, "r+") 
    newWords={} 
    for words in file.read().split(): 
     if words not in newWords: 
      newWords[words] = 1 
     else: 
      newWords[words] += 1 

    for k,v in frequency.items(): 
     print (k, v) 
    file.close() 

Теперь, это распечатать все, что/путь/Я хочу, но есть некоторые слова, которые используются более чем другие, которые ниже по списку. Я попытался с помощью newWords.sort(), но он говорит:

"AttributeError: 'dict' object has no attribute 'sort'" 

Так что я в недоумении, что делать, потому что мои знания весьма ограничены.

+1

Что входной файл выглядеть ? – Totem

+1

В словарях нет 'sort()', но вы можете передать их в 'sorted()'. – TigerhawkT3

ответ

1

Печатает наиболее часто используемые слова первого:

from operator import itemgetter 

for k, v in sorted(frequency.items(), key=itemgetter(1), reverse=True): 
    print(k, v) 

key это функция, которая используется для сортировки. В нашем случае itemgetter извлекает значение, то есть частоту в качестве критерия сортировки.

Альтернатива без импорта:

for k, v in sorted(frequency.items(), key=lambda x: x[1], reverse=True): 
    print(k, v) 
+0

Импорт импортных товаров не требуется. А может быть, объяснение? – TigerhawkT3

+0

@ TigerhawkT3 'itemgetter' немного лучше, чем' lambda'. Я думаю, что это стоит импорта. Я все еще писал некоторые объяснения. –

+0

Вам также не нужна «лямбда». – TigerhawkT3

1

Вы можете попробовать этот подход:

from collections import Counter 

with open('file_name.txt') as f: 
    c=Counter(f.read().split()) 
    print c.most_common() 
+0

О, не знал, спасибо :) –

2

Не изобретайте колесо на collections.Counter будет делать подсчет и упорядоченность с .most_common, который даст вам от наименее распространенных слов в указанном порядке:

from collections import Counter 
def wordCounter(thing): 
    with open(thing) as f: 
     cn = Counter(w for line in f for w in line.split()) 
     return cn.most_common() 

Вам также не нужно читать весь файл в памяти, вы можете итерации по очереди и разделять каждую строку. Вы также должны учитывать знаки препинания, которые вы можете лишить его с str.strip:

def wordCounter(thing): 
    from string import punctuation 
    with open(thing) as f: 
     cn = Counter(w.strip(punctuation) for line in f for w in line.split()) 
     return cn.most_common() 
0

Словари не имеют метод sort(). Тем не менее, вы можете передать словарь во встроенную функцию sorted(), и он произведет ключи от словаря list. Используйте ключ сортировки с функцией, которая возвращает значение словаря слова, которое является методом get().

for key in sorted(newWords, key=newWords.get): 
    print(key, newWords[key]) 

Кроме того, похоже, что вы делали некоторые рефакторинга, поскольку frequency не определен в коде.

0

Если вы хотите отсортировать без импорта:

word_count = sorted(new_words.items(), key=lambda x: x[1], reverse=True) 

Примечание: Используя регулярное выражение, чтобы напечатать все слова это лучший подход:

import re 
from collections import defaultdict 

word_count = defaultdict(int) 
pattern = re.compile("[a-zA-Z][a-zA-Z0-9]*") 
file = open("file.txt", 'r') 
for line in file: 
    for word in pattern.findall(line): 
       word_count[word] += 1