为什么这个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字符

我正在编写一个python程序来查找单词中的字符序列。但该计划却产生了意想不到的结果。 我发现了一个类似类型的程序,它可以完美地工作。 对我来说,我认为这两个程序非常相似,但不知道为什么其中一个不起作用

  • 不工作的程序:
  • #在单词中显示字符序列
    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'))
    
  • 第一个程序的输出为:
  • 输入字符串: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()

  • 两个程序的逻辑相同,即在字典上迭代,检查字典中是否存在密钥。如果不存在,请使用count
    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
    >>>