2016-11-03 10 views
0

Also im Grunde muss ich ein Programm machen, das den Benutzer nach einem String fragt und dann die Anzahl der Vokale im String zählt und ausgibt. Die Vokale, die zählen, sind a, e, i, o, u, y und die Großbuchstaben von diesen. Zum Beispiel würde die Eingabe "Ebenholz und Elfenbein" 7 drucken. Ich kann auch eingebaute String-Funktionen für dieses Problem verwenden.Versuchen Sie, eine Anfänger-Python-Looping-Aufgabe zu lösen?

Dies ist, was ich bisher:

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.")  

Jedoch habe ich den Fehler erhalte:

IndexError: string index out of range 

Bitte helfen ?? Ich benutze Python3

Antwort

3

Zuerst müssen Sie nicht auf userString[n+1] schauen. Der Versuch, dies zu tun, wenn n bereits der letzte Index ist, ist das erste, was diese Fehlermeldung auslöst.

Zweitens, selbst wenn Sie diesen Test entfernen, wird Ihre Schleife immer noch nicht beendet, wenn es sollte, da das nul Zeichen, das am Ende der Zeichenfolge sucht, ein Implementierungsdetail in der Laufzeit des C-Codes ist Python-Interpreter. Von Python selbst kann auf dieses Zeichen nicht zugegriffen werden. Daher wird ord(userString[n]) niemals 0 sein für n, es sei denn, Sie setzen explizit "\0" in die Zeichenfolge auf der Python-Ebene. Ist dies nicht der Fall, wird die Schleife über das Ende der Zeichenfolge hinaus segeln und IndexError auslösen, wenn Sie versuchen, auf userString[n] mit n zuzugreifen, die der Länge der Zeichenfolge entspricht.

Es gibt bessere Möglichkeiten, um eine Schleife durch eine Zeichenfolge in Python, aber die einfachste Lösung für Ihren Code ist die while Bedingung, dies zu ändern:

while n < len(userString): 

Wenn len zählt als „integrierte String-Funktion “, die fraglich ist, dann sollten Sie nur eine Schleife über den String in einer typischeren Pythonic Weise:

for ch in userString: 
    if (ch == 'a' or ch=='A'): 
    a += 1 
    numVowels += 1 
    ... 

Es gibt Verbesserungen, die den bedingten Code vorgenommen werden kann, die auch für Vokale überprüft (wie in mbaytas Antwort), b Aber das war nicht deine Frage.

+0

ist len ​​(Zeichenkette) eine eingebaute Zeichenkettenfunktion? – Lia

+0

Es ist eine integrierte globale Funktion, nicht auf Strings beschränkt; Es funktioniert auch auf Listen und Tupeln. –

+0

Ich habe eine 'len()' weniger Option hinzugefügt; siehe Bearbeiten. –

2

In Python können Sie wie bei einer Liste über eine Zeichenfolge iterieren.

diese Funktionalität Ausnutzen und unter Verwendung einer Liste, die die Vokale zu speichern, können Sie etwas entlang der Linien der folgenden Code verwenden, um die Funktionalität zu erreichen Sie wollen:

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 

Ich sehe, dass Ihr Code in der Frage verwendet Bedingungen und Schleifen, aber keine Listen. Wenn Sie möchten, mit Listen aus irgendwelchen Gründen vermeiden (zB nicht in der Klasse abgedeckt noch) nicht, können Sie wie folgt vorgehen:

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 

Sie auch den Code oben mit elif Anweisungen ändern können anstelle von or Logik zu brechen das Auftreten von jedem Vokal.

Wenn Sie die while Schleife mit der for ... in ... Funktionalität vermeiden möchten und halten, sollten Sie Folgendes beachten:

vowelCount = 0 
index = 0 
while (index < len(inputString)): 
    if (inputString[index] in vowels): 
    vowelCount += 1 
    index += 1 
+0

Persönlich würde ich 'senken (Zeichen)' –

1

Es ist immer ein guter Ansatz zunächst den allgemeinen Fall zu implementieren und zu Ihrem speziellen Fall ergeben sich aus Das. Ich nahm an, dass Sie "erlaubt" sind, ein dict zu verwenden. Ich habe dafür die eingebauten Methoden str vermieden.

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) 
0

Ich gebe ein versuchen es auch :) Code unten einzelnen Vokal und dass für die Gesamt Vokale zählen zusammenzufassen

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)) 
+0

Sie konnten 'low()' die Eingabezeichenkette, und überprüfen Sie nur Kleinbuchstaben –

+0

@ cricket_007, ich weiß, kann niedrigere Funktion verwenden, ich will nur die Frage Regel erfüllen, die nicht kann BENUTZEN Sie eine eingebaute String-Funktion. Wenn nicht, würde ich nur die Zeichenkettenzählmethode benutzen, um den Job einfacher zu erledigen – Skycc

+0

Was betrachten wir Zeichenkettenfunktionen? Ist nicht '__iter__' die String-Funktion, die' für c in input_string' erlaubt? –

0

Python bietet viele Funktionen, die Probleme wie diese eine Freude machen zu lösen. Wörterbuchkomprehensionen, Listenkomprehensionen, etc .:

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:"))) 
Verwandte Themen