Python подсчет букв в dict не считая - PullRequest
0 голосов
/ 13 февраля 2020

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

enter code here

import string
"""creating a dict made of letters and values as 0"""
counter=dict.fromkeys(string.ascii_lowercase,0)
test=counter

first=str(input("enter a sentence:"))
def fuc():
   char=counter.keys()
   for i in char:
        if i in first and char:
            test[i] = first.count(i)

fuc()
print(test) 

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Результат, который вы получите, действительно соответствует ожидаемому от вашего кода - для каждого символа в counter.keys() (IOW для каждого символа в string.ascii_lowercase), если символ находится в предложении, вы увеличиваете счетчик на единицу , Поскольку каждый символ в counter.keys() гарантированно появляется только один раз, его счетчик может быть увеличен только на один в лучшем случае.

В качестве примечания, в вашем коде есть несколько вещей, которые либо бесполезны, либо не выполняют то, что вы ожидаете:

Это:

test = counter

не делает Чтобы сделать копию counter, просто укажите оба имени на один и тот же объект. Возможно, вы захотите прочитать это для более подробного (но очень четкого) объяснения.

Если вы хотите получить копию объекта, вы должны явно запросить ее. В вашем случае достаточно мелкой копии, так как значения вашего dict неизменны, поэтому вы можете просто использовать dict.copy():

test = counter.copy()

Если ваши значения были изменяемыми - например, если у вас был список списков и хотите, чтобы сами списки тоже копировались - вместо этого вы должны использовать copy.deepcopy():

>>> d = {"a": []}
>>> dd = d.copy()
>>> # d and dd are different objects
>>> d is dd
False
>>> # but d["a"] and dd["a"] are still the same object
>>> d["a"] is dd["a"]
True
>>> # now with a deep copy:
>>> import copy
>>> ddd = copy.deepcopy(d)
>>> # this time the values have been copied too
>>> d["a"] is ddd["a"]
False 

Здесь:

first=str(input("enter a sentence:"))

Если вы используете Python3, input() гарантированно возвращает строку, поэтому нет необходимости делать ее снова строкой.

Если вы используете Python 2.x, вам действительно нужно перейти на Python3 - Python 2 официально мертв. Но если нет, вы хотите использовать raw_input() вместо.

А здесь:

if i in first and char:

Я не уверен, что вы ожидаете от части and char, но в этом случае он просто пожирает циклы процессора. выражение i in first and char анализируется как (i in first) and (char) - поэтому сначала вычисляется левая часть (i in first), получая логическое значение. Затем оценивается и вторая часть (char). Поскольку это непустой контейнер (если он был пустым, тело l oop вообще не будет исключаться), он всегда имеет истинное значение в логическом контексте. Итак, вы можете переписать это как

if i in first and True:

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

if i in first:
0 голосов
/ 13 февраля 2020

Используйте count() вместо:

import string
test = dict.fromkeys(string.ascii_lowercase,0)
first = input("enter a sentence:")

def func():
    for i in set(first):
        test[i] = first.count(i)

func()
print(test) 
...