【问题标题】:Why this python character sequence code giving unexpected result?为什么这个 python 字符序列码给出了意想不到的结果?
【发布时间】:2019-09-16 11:30:56
【问题描述】:

我正在编写一个 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}

以上是正确的输出。

现在是我脑海中的问题。

我。为什么第一个程序不能正常工作?

二。难道这两个方案的意识形态不同?

【问题讨论】:

  • 旁注:这里的规范解决方案是return collections.Counter(str1),因为计算可迭代次数是一个已解决的问题(在现代 Python 中,Counter 有一个 C 加速器,它的运行速度比你可以编写的任何东西都快手)。

标签: python python-3.x dictionary frequency


【解决方案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}
>>> 

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

比较 keyd.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

非常感谢。

【讨论】:

  • 要像英语一样阅读,通常首选使用x not in y,而不是not x in y。它们的行为相同,但前者读起来更清楚。 Python 的 PEP8 仅针对 is 专门解决它(其中 x is not y 明显优于 not x is y),但同样的原则适用。
  • 你让我学习。非常感谢您的时间和精力。
【解决方案2】:

这一行是荒谬的:

if letter !=dict.keys():

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

if letter not in dict:

(如果你真的想要,你可以添加.keys(),但这既浪费又没有意义;dict 上的成员资格测试会隐式检查其密钥)。

旁注:你会通过命名变量dict 来混淆你自己,因为你在命名dict 构造函数;如果您需要使用它,它将在该范围内不可用。尽可能不要隐藏内置名称。

【讨论】:

  • 你的回答让我了解了python的一些核心。非常感谢您的宝贵时间。
猜你喜欢
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
  • 2019-05-19
  • 2017-01-05
  • 2021-10-14
相关资源
最近更新 更多