为什么这个python字符序列代码给出意想不到的结果

问题描述 投票:2回答:2

我正在编写一个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。这两个方案的意识形态是不同的?

python python-3.x dictionary frequency
2个回答
1
投票

实际上,你使用的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}
>>> 

您还可以查看终端上执行的以下语句。

将键与d.keys()进行比较将始终返回False,因为键是一个字符串,而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增加相关计数。

谢谢v。


1
投票

这条线是荒谬的:

if letter !=dict.keys():

letter是一个长度str,而dict.keys()返回一个关键视图对象,保证永远不会等于任何类型的str。你的if检查总是错误的。正确的逻辑是:

if letter not in dict:

(你可以添加.keys(),如果你真的想要,但这是浪费和毫无意义;对dict的成员资格测试是隐含地检查它的键)。

旁注:你会通过命名变量dict来混淆自己的垃圾,因为你的名字是阴影dict构造函数;如果您需要使用它,它将无法在该范围内使用。如果可能的话,不要影响内置名称。

© www.soinside.com 2019 - 2024. All rights reserved.