试图用Python制作一个元音计数器,Y值第一次计算两次?

时间:2015-12-11 22:00:21

标签: python

首先,我知道有更简单(更好)的方法,我对此非常陌生。 当我运行它时,它工作正常,除了第一次计算Y,它增加2.如果我从y=-1开始,一切都正确。造成这种情况的原因是什么?

word=raw_input("Input your word>")
a=0
e=0
i=0
o=0
u=0
y=0

letternumber=len(word)
while letternumber>=0:
    letternumber=letternumber-1
    if word[int(letternumber)].lower() == "a":
        a=a+1
    elif word[int(letternumber)].lower() == "e":
        e=e+1
    elif word[int(letternumber)].lower() == "i":
        i=i+1
    elif word[int(letternumber)].lower() == "o":
        o=o+1
    elif word[int(letternumber)].lower() == "u":
        u=u+1
    elif word[int(letternumber)].lower() == "y":
        y=y+1
else:

    print str(a) + str(e) + str(i) + str(o) + str(u) + str(y)

3 个答案:

答案 0 :(得分:3)

您的while循环逻辑已损坏。将letternumber>=0:更改为letternumber>0:,因为在您的循环中,您在检查单词中的位置之前递减letternumber。您最终在-1处检查word或再次检查最后一个字母(因此以元音结尾的单词将被计算两次)

答案 1 :(得分:3)

其他答案是对的,您需要letternumber > 0。但是你的代码并不是非常Pythonic。

稍微好一点的解决方法是使用"用于"循环:

for letternumber in range(len(word)):
    if word[letternumber].lower() == "a":
        ... etc

(那个解决方案,以及我要展示的所有其他解决方案,按顺序而不是倒退,但这并不重要)。

更好的解决方法是使用" for"因为你并不真正需要索引到单词中。您也可以在循环开始时转换为小写一次,而不是每个字母转换6次:

word=raw_input("Input your word>")
a=0
e=0
i=0
o=0
u=0
y=0

for letter in word.lower():
    if letter == "a":
        a=a+1
    elif letter == "e":
        e=e+1
    elif letter == "i":
        i=i+1
    elif letter == "o":
        o=o+1
    elif letter == "u":
        u=u+1
    elif letter == "y":
        y=y+1

print str(a) + str(e) + str(i) + str(o) + str(u) + str(y)

最好的解决方法是使用标准库的计数器(Python 2.7中的新功能):

from collections import Counter

word = raw_input("Input your word>")
counts = Counter(word.lower())
a = counts['a']
e = counts['e']
i = counts['i']
o = counts['o']
u = counts['u']
y = counts['y']
print str(a) + str(e) + str(i) + str(o) + str(u) + str(y)

答案 2 :(得分:0)

如果你投入一个字母位置'计数器,你可以看到问题:

while letternumber >=0:
    print letternumber

脚本沿着字符串中的字符索引计算到' 0'位置,从'长度开始' - 你最终得到一个额外的循环,对应于位置'长度' (这比字符串的最后一个位置多一个) - 这就是@Steve Jessop所指出的。如果最后一个字母是元音,你的程序最终会计数两次(例如,我使用' apple'进行测试,并且它会计算' e')。

如果您将计数器设置为:

letternumber = len(word) - 1

然后一切都表现得很好。

更改while循环(上面)也可以。