2016-01-07 5 views
1

Мне нужно сделать функцию, которая читает строку и возвращает словарь, где ключи - это слова в строке, а значения - сколько раз они встречаются.Python: словари и подсчет слов

Это то, что я пробовал:

def countWords(arg): 
     dic = {} 
     for i in agr: 
      if i in dic: 
       dic[i] += 1 
      else: 
       dic[i] = 1 
     return dic 

Который только подсчитывает, сколько раз появляется буква.

Я думал отделяя каждое слово в другую позицию списка первый, но я не знаю, как, или даже если это правильный путь здесь ..

Что я должен делать?

+0

см collections.Counter –

+0

Возможного дубликат [кол-частотного элемента в питоне] (http://stackoverflow.com/questions/893417/item -frequency-count-in-python) – thefourtheye

ответ

1

Это идеальный случай для Словаря по умолчанию: https://docs.python.org/2/library/collections.html#collections.defaultdict

import collections as co 

def countWords(arg): 
    dd = co.defaultdict(int) # since we want counts we use int 
    for i in arg.split(): # split on whitespace 
     dd[i] += 1   # when a new key is encountered the default value is entered 
    return dd 
+0

спасибо! Я обнаружил, что мне не нужно импортировать. Мне удалось просто использовать split – Mary09

+0

. Добро пожаловать. – bernie

1

См. collections.Counter. Это обычно считается лучшим решением для такого типа проблем.

from collections import Counter 


def countWords(s): 
    return Counter(s.split()) 

Если вы не хотите использовать модуль коллекции, вы можете использовать try...except блок.

def countWords(s): 
    d = {} 
    for word in s.split(): 
     try: 
      d[word] += 1 
     except KeyError: 
      d[word] = 1 
    return d 

Еще одна альтернатива использовать дополнительный параметр dict.get() по умолчанию.

def countWords(s): 
    d = {} 
    for word in s.split(): 
     d[word] = d.get(word, 0) + 1 
    return d 

Как вы можете видеть, существует множество различных способов решения этой задачи.

+0

Это предложение не подходит для того, что спрашивает ОП, ИМО. Он не спрашивает: «Как я могу подсчитать частоты слов в предложении или строке». – nbro

+0

@nbro Когда я добавил второй вариант, ответ Берни еще не появился для меня. Когда я увидел, что у него была ранняя метка времени, я удалил эту часть своего ответа. Мое первоначальное предложение - это лучший способ решить эту задачу. На самом деле, эта задача является наиболее распространенным вариантом использования коллекций. Контент, который я видел. – pzp