我必须制作一个程序,要求用户输入一个字符串,然后计算并打印字符串中的元音数量。计数的元音是a,e,i,o,u,y,以及这些的大写版本。例如,输入“乌木和象牙”将打印7.我也不能使用任何内置字符串函数来解决此问题。
这是我到目前为止所做的:
userString = str(input("Please enter a string:"))
numVowels = 0
n=0
a=0
e=0
i=0
o=0
u=0
y=0
while (ord(userString[n]) != 0 or ord(userString[n+1])!=0):
if (userString[n] == 'a' or userString[n]=='A'):
a += 1
numVowels += 1
elif (userString[n] == 'e' or userString[n]=='E'):
e += 1
numVowels += 1
elif (userString[n] == 'i' or userString[n]=='I'):
i += 1
numVowels += 1
elif (userString[n] == 'o' or userString[n]=='O'):
o += 1
numVowels += 1
elif (userString[n] == 'u' or userString[n]=='U'):
u += 1
numVowels += 1
elif (userString[n] == 'y' or userString[n]=='Y'):
y += 1
numVowels += 1
n+=1
print("There are", numVowels, "vowels. There are", a, "A's", e, "E's", i, "I's", o, "O's", u, "U's, and", y, "Y's, including both uppercase and lowercase versions.")
但是我一直收到错误:
IndexError: string index out of range
我使用的是Python 3。
答案 0 :(得分:2)
首先,您不需要查看userString[n+1]
。当n
已经是最后一个索引时尝试这样做是触发该错误消息的第一件事。
其次,即使你删除了那个测试,你的循环仍然不会终止,因为它在字符串末尾寻找的nul
字符是运行时的实现细节包含Python解释器的C代码。从Python本身来看,该字符是不可访问的,因此ord(userString[n])
对于任何n
永远不会为0,除非您在Python级别明确地将"\0"
放在字符串中。如果失败了,当你尝试访问IndexError
userString[n]
等于字符串的长度时,循环将越过字符串的末尾并触发相同的n
。
有更好的方法在Python中循环遍历字符串,但对代码的最简单修复是将while
条件更改为:
while n < len(userString):
如果len
计为&#34;内置字符串函数&#34;,这是有争议的,那么你应该以更典型的Pythonic方式循环遍历字符串:
for ch in userString:
if (ch == 'a' or ch=='A'):
a += 1
numVowels += 1
...
可以对检查元音的条件代码进行改进(如mbaytas的答案),但这不是你的问题。
答案 1 :(得分:1)
在Python中,您可以迭代字符串,就像在列表上一样。
利用此功能,并使用列表存储元音,您可以使用以下代码中的内容来实现您想要的功能:
inputString = "This is our input string."
vowels = ["A", "E", "I", "O", "U", "Y", "a", "e", "i", "o", "u", "y"]
vowelCount = 0
for character in inputString:
if (character in vowels):
vowelCount += 1
print vowelCount
我看到问题中的代码使用了条件和循环,但没有使用列表。如果您因某些原因而不想使用列表(例如,尚未在课程中介绍),您可以执行以下操作:
inputString = "This is our input string."
vowelCount = 0
for character in inputString:
if (character == 'A' or
character == 'E' or
character == 'I' or
character == 'O' or
character == 'U' or
character == 'Y' or
character == 'a' or
character == 'e' or
character == 'i' or
character == 'o' or
character == 'u' or
character == 'y'):
vowelCount += 1
print vowelCount
您还可以使用elif
语句而不是or
逻辑来修改上面的代码,以分解每个元音的出现。
如果您不想使用for ... in ...
功能并坚持while
循环,请考虑以下事项:
vowelCount = 0
index = 0
while (index < len(inputString)):
if (inputString[index] in vowels):
vowelCount += 1
index += 1
答案 2 :(得分:1)
Python提供了许多功能,可以解决像这样的问题。字典理解,列表理解等:
vowels = {v: 1 for v in 'aeiouyAEIOUY'}
def num_vowels(input_string):
return sum(vowels.get(character, 0) for character in input_string)
print(num_vowels(str(input("Please enter a string:")))
答案 3 :(得分:0)
首先实施一般案例总是一个很好的方法,并从中得出你的特殊情况。我假设您可以“允许”使用str
。我为此避免了def count_chars(s, chars):
cdict = {i:0 for i in chars}
for c in s:
try:
cdict[c] += 1
except KeyError:
pass
return cdict
def count_vowels(s):
chars = ['a','e','i','o','u', 'y', 'A', 'E', 'I', 'O', 'U', 'Y']
vowels = count_chars(s, chars=chars)
return vowels, sum(vowels.values())
# test it
tally, total = count_vowels(str(input()))
print(tally, total)
的内置方法。
$HOME
答案 4 :(得分:0)
我也试一试:) 单个元音下面的代码和总元音数的总和
input_string = str(input("Please enter a string: "))
vowel = [['a','A'], ['e','E'], ['i','I'], ['o','O'], ['u','U'], ['y','Y']]
vc = [0] * 6 # individual vowel count
for ch in input_string:
for i,v in enumerate(vowel):
if ch in v:
vc[i] += 1
total = sum(vc)
print("There are", total, "vowels.")
print("There are {0} A's {1} E's {2} I's {3} O's {4} U's, and {5} Y's, including both uppercase and lowercase versions.".format(*vc))