почему это понимание словаря Python не работает для подсчета слов во входных данных()?

#python

Вопрос:

Я должен посчитать, сколько раз слово используется в предложении. Я нашел решение, однако я хочу, чтобы код был более кратким, и хочу решить его с помощью понимания словаря. Может кто-нибудь, пожалуйста, помочь мне понять, что не так со следующим кодом?

 user_input = input().lower().split()
usage_dict = dict()
usage_dict = {word:usage_dict.get(word, 0)   1 for word in user_input}
print(usage_dict)
 

Ввод : a aa abC aa ac abc bcd a

Выход : {'a': 1, 'aa': 1, 'abc': 1, 'ac': 1, 'bcd': 1}

Ожидаемые результаты: {'a': 2, 'aa': 2, 'abc': 2, 'ac': 1, 'bcd': 1}

Ответ №1:

Проблема

Словарь usage_dict создается после завершения понимания диктанта, нет понятия временного состояния диктанта, поэтому usage_dict.get(word, 0) всегда дает 0

Это работает только в цикле for:

 usage_dict = {}
for word in user_input:
    usage_dict[word] = usage_dict.get(word, 0)   1
 

Решения

Воспользуйся list.count()

 usage_dict = {word: user_input.count(word) for word in set(user_input)}
 

Используйте collections.Counter , который использует тот же цикл для, что и выше

 usage_dict = Counter(user_input)
 

Комментарии:

1. Я не знал, что словарь не обновляется с каждой итерацией в понимании диктанта. Теперь я знаю! @азро

2. @RahulDeshmukh это то же самое для понимания списка

3. @RahulDeshmukh Вы можете подумать о принятии ответа, если он вас удовлетворит 😉

4. Да, stackoverflow попросил меня подождать еще 3 минуты, чтобы принять ответ 🙂

Ответ №2:

Попробуйте использовать Counter

 from collections import Counter

user_input = input().lower().split()
usage_dict = Counter(user_input)
print(usage_dict)
 

Или:

 usage_dict = {x:user_input.count(x) for x in user_input}
 

ВОЗВРАТ

 {'a': 2, 'aa': 2, 'abc': 2, 'ac': 1, 'bcd': 1}
 

Комментарии:

1. Я бы сказал, что ответ, должен … ответить на вопрос. что здесь «что не так со следующим кодом?» А ты этого не делаешь 😉

Ответ №3:

Используйте Счетчик. Смотреть ниже

 from collections import Counter

data = 'a aa abC aa ac abc bcd a'.split()
c = Counter(data)
print(c)
 

выход

 Counter({'a': 2, 'aa': 2, 'abC': 1, 'ac': 1, 'abc': 1, 'bcd': 1})
 

Комментарии:

1.Я бы сказал, что ответ, должен … ответить на вопрос. что здесь «что не так со следующим кодом?» А ты этого не делаешь 😉

Ответ №4:

Вы могли бы использовать понимание словаря:

 user_input = input().lower().split()
usage_dict = {word: user_input.count(word) for word in user_input}
print(usage_dict)
 

Или использовать collections.Counter :

 import collections
user_input = input().lower().split()
usage_dict = collections.Counter(user_input)
print(usage_dict)
 

Вывод обоих кодов:

 {'a': 2, 'aa': 2, 'abc': 2, 'ac': 1, 'bcd': 1}
 

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

Комментарии:

1. Я бы сказал, что ответ, должен … ответить на вопрос. что здесь «что не так со следующим кодом?» А ты этого не делаешь 😉

2. @azro отредактировал мой ответ с объяснением