为什么这个python字符序列代码会给出意外的结果?
我正在编写一个python程序来查找单词中的字符序列。但该计划却产生了意想不到的结果。 我发现了一个类似类型的程序,它可以完美地工作。 对我来说,我认为这两个程序非常相似,但不知道为什么其中一个不起作用为什么这个python字符序列代码会给出意外的结果?,python,python-3.x,dictionary,frequency,Python,Python 3.x,Dictionary,Frequency,我正在编写一个python程序来查找单词中的字符序列。但该计划却产生了意想不到的结果。 我发现了一个类似类型的程序,它可以完美地工作。 对我来说,我认为这两个程序非常相似,但不知道为什么其中一个不起作用 不工作的程序: #在单词中显示字符序列 dict={} 字符串=输入(“输入字符串:”).strip().lower() 对于字符串中的字母: 如果信=dict.keys(): dict[字母]=1 其他: dict[字母]=dict[字母]+1 打印(dict) 正在运行的程序: def字符
#在单词中显示字符序列
dict={}
字符串=输入(“输入字符串:”).strip().lower()
对于字符串中的字母:
如果信=dict.keys():
dict[字母]=1
其他:
dict[字母]=dict[字母]+1
打印(dict)
def字符频率(str1):
dict={}
对于str1中的n:
keys=dict.keys()
如果n在键中:
dict[n]+=1
其他:
dict[n]=1
返回指令
打印(字符频率('google.com'))
{'g':1,'c':1,'m':1,'o':1,'l':1,'e':1}
{'c':1,'e':1,'o':3,'g':2,':1,'m':1,'l':1}
以上是正确的输出
现在我脑子里的问题
一,。为什么第一个程序不能正常工作
二,。这两个节目的意识形态不同吗?这句话毫无意义:
if letter !=dict.keys():
letter
是长度为1的str
,而dict.keys()
返回一个键视图对象,该对象保证永远不等于任何类型的str
。您的if
检查总是错误的。正确的逻辑是:
if letter not in dict:
(如果您真的愿意,可以添加.keys()
,但这是浪费和毫无意义的;对dict
进行成员资格测试就是隐式检查其键)
旁注:命名一个变量
dict
,你会把自己弄糊涂,因为你的名字隐藏在dict
构造函数的后面;如果您需要使用它,它将不在该范围内可用。尽可能不要隐藏内置名称。实际上,您使用的if语句中有一个小错误。看看下面修改的程序
注意:还要确保不要使用预定义的数据类型名称,如dict作为变量名称。我在这里把它改成了d
您还可以查看在终端上执行的以下语句
将键与d.keys()进行比较将始终返回False
,因为键在这里是字符串,d.keys()将始终是dict_keys
(Python3)和列表
(Python2)类型的对象
回答您的两个问题:
字母!=dict.keys()
始终为True
,因此密钥计数不会增加。只需将其更改为字母而不是dict.keys()
。最好使用d
代替dict
,这样语句看起来像字母而不是d.keys()
1创建一个新密钥,否则将相关计数增加1
谢谢你。很多。旁注:这里的标准解决方案是
返回集合。计数器(str1)
,因为计算可重用项是一个已解决的问题(在现代Python中,计数器
有一个C加速器,运行速度比手工编写的任何东西都快)。要像英语一样阅读,通常倾向于使用x而不是y
,而不是y中的x。它们的行为相当,但前者读得更清楚。Python的PEP8只针对is
(其中x不是y
明显优于not x是y
),但同样的原则也适用。你让我学习。非常感谢您的时间和努力。您的回答让我了解了python的一些核心。非常感谢您抽出时间。
>>> 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 = {"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
>>>