Поиск частот слов-без счетчика
Я новичок, изучаю 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 ответа:
Проблема здесь:
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.