4

我正在尝试计算“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'两次。我不知道为什么。有什么帮助吗?

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

4

9 回答 9

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

为什么不是这个?

于 2010-12-30T14:58:43.183 回答
12

正如其他人提到的,您可以使用简单的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
于 2010-12-30T14:58:42.380 回答
1

为什么不简单

def has_no_e(word):
    return sum(1 for letter in word if letter=="e")
于 2010-12-30T14:54:18.390 回答
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")
于 2010-12-30T14:57:25.773 回答
1

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

  word[letters-1]

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

于 2010-12-30T14:58:55.753 回答
1

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

于 2010-12-30T14:59:43.057 回答
1

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

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

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

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

e (for word[3]) t (for word[2]) e (for word[1]) P (for word[0]) e (for word[-1])

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

于 2010-12-30T15:05:44.287 回答
1

@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
于 2010-12-30T16:50:53.947 回答
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
于 2010-12-31T16:01:55.683 回答