【问题标题】:Count letters in a word in python debug在python调试中计算单词中的字母
【发布时间】:2011-06-01 14:28:43
【问题描述】:

我正在尝试计算“e”在一个单词中出现的次数。

def has_no_e(word):     #counts 'e's in a word
    letters = len(word)
    count = 0
    while letters >= 0:
        if word[letters-1] == 'e':
            count = count + 1
        letters = letters - 1
    print count

它似乎工作正常,除非单词以“e”结尾。它会计算'e'两次。我不知道为什么。有什么帮助吗?

我知道我的代码可能很草率,我是初学者!我只是想弄清楚发生的事情背后的逻辑。

【问题讨论】:

  • 当字母 == 0 时会发生什么?你为什么要测试while letters >= 0?你能解释一下为什么你要这样做吗?解释会很有帮助。

标签: python count letter


【解决方案1】:

您不必使用 while 循环。字符串可用于 Python 中的 for 循环。

def has_no_e(word):
    count = 0
    for letter in word:
        if letter == "e":
            count += 1
    print count

或者更简单的:

def has_no_e(word):
    return sum(1 for letter in word if letter=="e")

【讨论】:

    【解决方案2】:

    如果您真正想要的是 'has_no_e',那么下面的方法可能比计算 'e' 然后再检查零更合适,

    def has_no_e(word):
      return 'e' not in word
    
    >>> has_no_e('Adrian')
    True
    >>> has_no_e('test')
    False
    >>> has_no_e('NYSE')
    True
    

    如果你想检查也没有'E',

    def has_no_e(word):
      return 'e' not in word.lower()
    
    >>> has_no_e('NYSE')
    False
    

    【讨论】:

      【解决方案3】:

      @marcog 提出了一些很好的观点;

      同时,您可以通过插入打印语句进行简单的调试 -

      def has_no_e(word):
          letters = len(word)
          count = 0
          while letters >= 0:
              ch = word[letters-1]         # what is it looking at?
              if ch == 'e':
                  count = count + 1
                  print('{0} <-'.format(ch))
              else:
                  print('{0}'.format(ch))
              letters = letters - 1
          print count
      

      然后

      has_no_e('tease')
      

      返回

      e <-
      s
      a
      e <-
      t
      e <-
      3
      

      从中可以看出

      1. 你正在以相反的顺序浏览字符串
      2. 它能正确识别 e 的
      3. 您正在“环绕”到字符串的末尾 - 因此,如果您的字符串以一个结尾,则额外的 e

      【讨论】:

        【解决方案4】:

        正如其他人提到的,您可以使用简单的word.count('e') 来实现测试。除非您将此作为一个简单的练习,否则这比尝试重新发明轮子要好得多。

        您的代码的问题在于它计算最后一个字符两次,因为您在最后测试索引-1,在 Python 中它返回字符串中的最后一个字符。通过将while letters &gt;= 0 更改为while letters &gt; 0 来修复它。

        还有其他方法可以整理你的代码(假设这是一个学习练习):

        • Python 提供了一种使用for 循环迭代字符串的好方法。这比使用while 循环和维护自己的计数器变量要简洁得多,也更容易阅读。正如您已经在这里看到的,增加复杂性会导致错误。保持简单。
        • 大多数语言都提供+= 运算符,用于将整数添加到变量中。比count = count + 1更简洁。
        • 使用参数来定义您要计算的字符以使其更加灵活。当您有明显的默认值时,请在参数列表中定义使用 char='e' 的默认参数。
        • 为函数选择一个更合适的名称。 has_no_e() 这个名字让读者认为代码检查代码是否没有 e,但实际上它所做的是计算 e 的出现次数。

        把这一切放在一起,我们得到:

        def count_letter(word, char='e'):
            count = 0
            for c in word:
                if c == char:
                    count += 1
            return count
        

        一些测试:

        >>> count_letter('tee')
        2
        >>> count_letter('tee', 't')
        1
        >>> count_letter('tee', 'f')
        0
        >>> count_letter('wh' + 'e'*100)
        100
        

        【讨论】:

          【解决方案5】:

          许多建议的解决方案都可以正常工作。

          知道,在 Python 中,list[-1] 将返回列表的最后一个元素。

          因此,在您的原始代码中,当您在受字母 >= 0 约束的 while 循环中引用 word[letters-1] 时,您将计算单词末尾的“e”两次(当字母长度为1,第二次为字母0)。

          例如,如果我的词是“Pete”,您的代码跟踪将如下所示(如果您在每个循环中打印出 word[letter]。

          e(对于单词[3]) t(对于单词[2]) e(对于单词[1]) P(对于单词[0]) e (for word[-1])

          希望这有助于澄清问题并揭示有关 Python 的一个有趣的小怪癖。

          【讨论】:

            【解决方案6】:

            当以 e 结尾时,它会计算两次,因为您将 letters 减少了一次太多(因为您循环 while letters &gt;= 0 并且您应该循环 while letters &gt; 0)。当letters 达到零时,您检查word[letters-1] == word[-1],它对应于单词中的最后一个字符。

            【讨论】:

              【解决方案7】:

              问题是迭代中“字母”的最后一个值是“0”,当发生这种情况时,您会查看:

                word[letters-1]
              

              意思是,你看一下word[-1],在python中的意思是“单词的最后一个字母”。
              所以你实际上计算正确,如果最后一个字母是'e',则添加一个“奖励”。

              【讨论】:

                【解决方案8】:
                >>> word = 'eeeooooohoooooeee'
                >>> word.count('e')
                6
                

                为什么不这样?

                【讨论】:

                  【解决方案9】:

                  为什么不简单

                  def has_no_e(word):
                      return sum(1 for letter in word if letter=="e")
                  

                  【讨论】:

                    猜你喜欢
                    • 2021-12-12
                    • 2011-09-15
                    • 1970-01-01
                    • 1970-01-01
                    • 2020-11-16
                    • 1970-01-01
                    • 2016-05-18
                    • 2020-10-04
                    • 1970-01-01
                    相关资源
                    最近更新 更多