Почему этот код последовательности символов Python дает неожиданный результат? - PullRequest
2 голосов
/ 27 апреля 2019

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

  1. Программа, которая не работает:
# Display the character sequence in a word
dict={}
string=input("Enter the string:").strip().lower()

for letter in string:
    if letter !=dict.keys():
        dict[letter]=1        
    else:
        dict[letter]=dict[letter]+1

print(dict)
  1. Программа, которая работает:
def char_frequency(str1):
    dict = {}
    for n in str1:
        keys = dict.keys()
        if n in keys:
            dict[n] += 1
        else:
            dict[n] = 1
    return dict

print(char_frequency('google.com'))
  1. Выход для первой программы дает:

Введите строку: google.com

{'g': 1, 'c': 1, 'm': 1, 'o': 1, 'l': 1, '.': 1, 'e': 1}
  1. Выход для второй программы:

{'c': 1, 'e': 1, 'o': 3, 'g': 2, '.': 1, 'm': 1, 'l': 1}

Выше приведен правильный вывод.

Теперь вопросы в моей голове.

я. Почему первая программа не работает правильно?

II. Отличается ли идеология этих двух программ?

Ответы [ 2 ]

1 голос
/ 27 апреля 2019

На самом деле, есть небольшая ошибка в утверждении if, которое вы использовали. Просто взгляните на приведенную ниже измененную программу.

Примечание: Также убедитесь, что в качестве имен переменных не используются предварительно определенные имена типов данных, такие как dict . Я изменил это на d здесь.

>>> d = {}
>>>
>>> string=input("Enter the string:").strip().lower()
Enter the string:google.com
>>> 
>>> for letter in string:
...     if letter not in d.keys():
...         d[letter] = 1        
...     else:
...         d[letter] = d[letter] + 1
... 
>>> print(d)
{'g': 2, 'o': 3, 'l': 1, 'e': 1, '.': 1, 'c': 1, 'm': 1}
>>> 

Вы также можете взглянуть на приведенные ниже операторы, выполняемые на терминале.

Сравнение key с d.keys () всегда вернет False, так как key - это строка здесь, а d.keys ( ) всегда будет объектом типа dict_keys (Python3) и list (Python2).

>>> d = {"k1": "v1", "k3": "v2", "k4": "Rishi"}
>>> 
>>> d.keys()
dict_keys(['k1', 'k3', 'k4'])
>>> 
>>> "k1" in d
True
>>> 
>>> not "k1" in d
False
>>> 
>>> "k1" == d.keys()
False
>>> 
>>> "k1" not in d
False
>>>

Ответы на ваши 2 вопроса:

  1. Поскольку оператор letter != dict.keys() всегда равен True, то есть нет приращений в счетчиках ключей. Просто измените его на letter not in dict.keys(). И лучше использовать d вместо dict, чтобы выражение выглядело как letter not in d.keys().

  2. Логика обеих программ одинакова, то есть перебирает словарь, проверяя наличие ключа в словаре. Если он не существует, создайте новый ключ со счетом 1, иначе увеличьте связанный счетчик на 1.

Спасибо вам большое.

1 голос
/ 27 апреля 2019

Эта строка бессмысленна:

if letter !=dict.keys():

letter имеет длину один str, а dict.keys() возвращает объект ключевого вида, который гарантированно никогда не будет равен str любого вида. Ваш if чек всегда ложь. Правильная логика будет такой:

if letter not in dict:

(вы можете добавить .keys(), если действительно хотите, но это расточительно и бессмысленно; проверка членства на dict неявно проверяет его ключи).

Примечание: вы будете путать дерьмо с самим собой, называя переменную dict, потому что вы скрываете имя конструктора dict; если вам когда-либо понадобится его использовать, он не будет доступен в этом объеме. Не скрывайте встроенные имена, если это вообще возможно.

...