Как мне сделать счетчик для каждого слова в списке и исправить эту программу?

В настоящее время я изучаю python, и я столкнулся с этой задачей: мне нужно извлечь содержимое файла .txt и сделать счетчик для каждого слова внутри. Я уже пробовал разные способы, но всегда получаю ошибку, которую не могу себе объяснить. Ошибка сейчас выглядит так:

для ключа в dic: TypeError: объект «NoneType» не является итерируемым

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

Моя текущая попытка выглядит так:


file = open("file.txt", "w")

file.write("English texts for beginners to practice reading and comprehension online and for free. Practicing your comprehension of written English will both improve your vocabulary and understanding of grammar and word order. The texts below are designed to help you develop while giving you an instant evaluation of your progress.")

file.close()

file = open("file.txt", "r")
List = file.read().split()
file.close

#If the word from the list is already in the dictonary, the programm shall check for the next word in List. If it is not in the dictonary it shall add it to the dictonary

def WordAdd(List):
    dic = {}
    for word in List:
        for key in dic:
            if word == key:
                break
        else:
            dic[word] = 0
    return dic

#counts the words inside the List
def Wordcount(L, dic):
    for x in L:
        dic[x]+=1

#Output of the elemts in the dictonary with its values
def Output(dic):
    for key in dic:
        print(key + ": ", key.get(key))

      

Output(Wordcount(List, WordAdd(List)))
´´´
WordCount нужно return dic
rdas 23.04.2022 12:02

Обратите внимание, что for key in dic: if word == key: просто (и гораздо эффективнее) if word in dic:

Thierry Lathuille 23.04.2022 12:05
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
2
34
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать этот код:

count = 0
file = open("file.txt", "r")
read_data = file.read()
words = set(read_data.split())
for word in words:
    count += 1
    
print('Total Unique Words:', count)

Во-первых, это не то, о чем просил OP - он не хотел подсчитывать уникальные слова, а подсчитывал вхождения слов. Во-вторых, вы дали очень плохую практику - счет просто len(words)

kosciej16 23.04.2022 12:24
Ответ принят как подходящий

Позвольте дать вам несколько советов. Давайте сначала попробуем понять ошибку:

for key in dic: TypeError: 'NoneType' object is not iterable

Этот синтаксис обычно предполагает, что правая сторона (в данном случае dic) является итерируемой (вы будете встречать ее много раз при изучении python). Вы можете думать об этом как о структуре, из которой вы можете получить элементы (например, списки или словари). Но здесь вы получаете NoneType, так что ваш dic is None. Откуда твой дик? Это то, что возвращает Wordcount!

def f():
    pass 
    # it's explicitly returns None, the same as writing return None

У нас есть первая проблема,

def Wordcount(L, dic):
    for x in L:
        dic[x]+=1
    # we need to return our dic here
    return dic

О, нет! Еще одна ошибка, что делать?

    print(key + ": ", key.get(key))
AttributeError: 'str' object has no attribute 'get'

Итак, теперь он говорит нам, что мы пытаемся получить доступ к атрибуту get типа str. Он думает, что наш key — это строка, почему?

    for key in dic:
        print(key + ": ", key.get(key))

Действительно, key — это просто ключ нашего словаря, так что вы, вероятно, имели в виду dic.get(key)

Теперь это работает! Некоторые несвязанные вещи, которые могут помочь вам в вашем приключении с питоном

Для взаимодействия с файлом вы должны использовать контекст, поэтому вместо:

file = open("file.txt", "w")
file.write("...")
file.close()

Использовать

with open("file.txt", "w") as file:
    file.write("...")

Он закроет для вас файл и защитит вас от того, что вы забудете о нем или сделаете ошибку программирования (смотрите, вы написали file.close вместо file.close()) или даже сбой программы.

Второе, что указано в комментарии

    for word in List:
        for key in dic:
            if word == key:
# should be
    for word in List:
        if key in dic:

И, как подсказка более высокого уровня, в python есть что-то вроде defaultdict, которое устанавливает значение по умолчанию, если ключ не существует, посмотрите

from collections import defaultdict

dic = defaultdict(int)
print(dic["a"]) # 0
dic["c"] += 1 # it works, dic["c"] does not exist so default value 0 is taken
print(d["c"]) # 1

Другие вопросы по теме