试图解决初学Python循环任务

时间:2016-11-03 04:50:36

标签: python python-3.x for-loop while-loop

我必须制作一个程序,要求用户输入一个字符串,然后计算并打印字符串中的元音数量。计数的元音是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。

5 个答案:

答案 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))