Поиск частот слов-без счетчика


Я новичок, изучаю Python 3.3 через http://GrokLearning.com

Моя цель-написать программу-счетчик слов, которая считывает несколько строк обычного текста от пользователя, а затем выводит каждое отдельное слово из пользовательского ввода с подсчетом, сколько раз слово встречается. Все входные данные будут состоять только из строчных слов - без знаков препинания и цифр. Выходной список будет располагаться в алфавитном порядке.

Программа не принимает никаких отправлений со счетчиком или коллекциями. Когда я отправляю решения, найденные в Stack Exchange с Counter, редактор просто делает вид, что кода счетчика не существует.

Вот что у меня есть до сих пор:

all = []
count = {}
line = input("Enter line: ")
while line:
    word = line.split()
    line = input("Enter line: ")
    for w in word:
        count[w] = word.count(w)
for word in sorted(count):
    print(word, count[word])

Проблема с моим кодом: если слово повторяется в нескольких строках, код будет считать только вхождения в последней строке, в которой появилось слово (вместо общего числа вхождений).

> this is another test test
> test test test test test
> test test test
> 
another 1
is 1
test 3
this 1

я знаю, что не использовал свой список "все". Я перепробовал все.добавить (слово), чтобы составить список всех слов, введенных пользователем, но мой код посчитал 0 (возможно, потому, что последняя строка должна быть пустой, чтобы закончить цикл while?)

Для справки, я прошелся по всем бесплатным модулям, но не по всем платным. Простите меня: поскольку мои знания ограничены, пожалуйста, объясните свой ответ простыми словами.
4 3

4 ответа:

Проблема здесь:

for w in word:
    count[w] = word.count(w)

В вашем коде вы не добавляете к вашему счету. Вместо этого высбрасываете счетчик каждый раз, когда встречаете слово. Например, если count['this'] раньше было 1, то при следующей встрече с ним вы снова устанавливаете счетчик на 1, а не добавляете к нему 1.

Вторая проблема связана с выражением word.count(w). Это подсчет того, сколько раз слово появляется на строке, в то же время, цикл повторяется через каждое слово. Это означает, что если вы правильно обновите (а не сбросьте) свой счетчик, вы будете считать слишком много.

Например, если в строке есть три 'test', то вы обновите число на 3 x 3 = 9.

Чтобы устранить проблему, вам нужно обратиться к двум случаям:

  • Если слово уже есть в графе (то есть вы видели это слово раньше), то увеличьте количество на 1
  • Если слово отсутствует в графе, вы видите его в первый раз, установите значение счетчика на 1

Вот предложение:

for w in word:
    if w in count:
        count[w] += 1
    else:
        count[w] = 1

Попробуйте следовать логике вашей программы на бумаге и посмотреть, что выскочит из вас.

  • пользователь вводит многострочный текст
  • цикл через каждую отдельную строку
    • установите счетчик на количество вхождений 'word' в текущей строке
    • перейти к следующей строке
  • цикл через найденные слова
    • печатное слово и его частота

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

Как бы вы отнеслись к этому "Жучку" на бумаге? Как бы вы тогда применили эту другую логику к своей программе?

Самое короткое исправление и самый быстрый код:

for w in word:
    count[w] = count.get(w, 0) + 1

Метод get возвращает значение, связанное с ключом, или второй необязательный параметр, если ключ не существует. (Если second не указан, а ключ еще не определен, то возвращается None). Таким образом, для всех слов, которые никогда не существовали, значение по умолчанию равно 0. Затем для каждого встреченного слова счетчик устанавливается на предыдущий счетчик + 1.

Вы можете сделать следующее в вашем цикле for

if w in count:
    count[w] += word.count(w)   # word already in dictionary, update the count
else:
    count[w] = word.count(w)    # word not in dictionary, add count for first time