在python调试中计算单词中的字母

时间:2010-12-30 14:52:17

标签: python count letter

我正在尝试计算一个单词中出现'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'。我不知道为什么。有什么帮助吗?

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

9 个答案:

答案 0 :(得分:11)

>>> word = 'eeeooooohoooooeee'
>>> word.count('e')
6

为什么不呢?

答案 1 :(得分:10)

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

你的代码的问题在于它计算了最后一个字符两次,因为你在最后测试索引-1,在Python中返回字符串中的最后一个字符。通过将while letters >= 0更改为while letters > 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

答案 2 :(得分:1)

为什么不简单

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

答案 3 :(得分:1)

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

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")

答案 4 :(得分:1)

问题是迭代中'字母'的最后一个值为'0',当发生这种情况时,你会看到:

  word[letters-1]

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

答案 5 :(得分:1)

以e结尾时会计算两次因为你将letters递减一次太多(因为你在letters >= 0时循环而你应该在letters > 0时循环)。当letters达到零时,您会检查word[letters-1] == word[-1],该对应于该字词中的最后一个字符。

答案 6 :(得分:1)

其中许多建议的解决方案都可以正常使用。

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

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

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

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

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

答案 7 :(得分:1)

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

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

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. 你正在'缠绕'到字符串的末尾 - 因此,如果你的字符串以一个字符串结尾,那就是额外的

答案 8 :(得分:1)

如果你真正想要的是'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