为什么这个 python 字符序列代码给出了意想不到的结果?
Why this python character sequence code giving unexpected result?
我正在编写一个 python 程序来查找单词中的字符序列。但是程序给出了意想不到的结果。
我找到了一个完美运行的类似类型的程序。
对我来说,我认为这两个程序非常相似,但不知道为什么其中一个不起作用
- 无法运行的程序:
# 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)
- 正在运行的程序:
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'))
- 第一个程序的输出为:
进入string:google.com
{'g': 1, 'c': 1, 'm': 1, 'o': 1, 'l': 1, '.': 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()
returns是一个键视图对象,保证永远不会等于str
任何形式的。您的 if
检查 总是 错误。正确的逻辑是:
if letter not in dict:
(如果你真的想要,你可以添加 .keys()
,但这是浪费和毫无意义的;dict
上的成员资格测试正在隐式检查它的键)。
旁注:您将通过命名变量 dict
来混淆自己的废话,因为您正在对 dict
构造函数进行名称隐藏;如果您需要使用它,它在该范围内将不可用。尽可能不要隐藏内置名称。
实际上,您使用的 if 语句中存在一个小错误。看看下面修改后的程序。
Note: Also make sure not to use pre-defined data type names like dict as variable names. I have changed that to d here.
>>> 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() 将始终 return 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 个问题的答案:
因为语句 letter != dict.keys()
总是 True
所以键数没有增加。只需将其更改为 letter not in dict.keys()
。并且最好使用 d
代替 dict
以便语句看起来像 letter not in d.keys()
.
两个程序的逻辑相同,即遍历字典,检查字典中是否存在键。如果不存在,则创建一个计数为 1
的新密钥,否则将相关计数增加 1
。
非常感谢你
我正在编写一个 python 程序来查找单词中的字符序列。但是程序给出了意想不到的结果。 我找到了一个完美运行的类似类型的程序。 对我来说,我认为这两个程序非常相似,但不知道为什么其中一个不起作用
- 无法运行的程序:
# 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)
- 正在运行的程序:
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'))
- 第一个程序的输出为:
进入string:google.com
{'g': 1, 'c': 1, 'm': 1, 'o': 1, 'l': 1, '.': 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()
returns是一个键视图对象,保证永远不会等于str
任何形式的。您的 if
检查 总是 错误。正确的逻辑是:
if letter not in dict:
(如果你真的想要,你可以添加 .keys()
,但这是浪费和毫无意义的;dict
上的成员资格测试正在隐式检查它的键)。
旁注:您将通过命名变量 dict
来混淆自己的废话,因为您正在对 dict
构造函数进行名称隐藏;如果您需要使用它,它在该范围内将不可用。尽可能不要隐藏内置名称。
实际上,您使用的 if 语句中存在一个小错误。看看下面修改后的程序。
Note: Also make sure not to use pre-defined data type names like dict as variable names. I have changed that to d here.
>>> 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() 将始终 return 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 个问题的答案:
因为语句
letter != dict.keys()
总是True
所以键数没有增加。只需将其更改为letter not in dict.keys()
。并且最好使用d
代替dict
以便语句看起来像letter not in d.keys()
.两个程序的逻辑相同,即遍历字典,检查字典中是否存在键。如果不存在,则创建一个计数为
1
的新密钥,否则将相关计数增加1
。
非常感谢你