Результат, который вы получите, действительно соответствует ожидаемому от вашего кода - для каждого символа в 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: