首先,我知道有更简单(更好)的方法,我对此非常陌生。
当我运行它时,它工作正常,除了第一次计算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)
答案 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循环(上面)也可以。