2017-03-27 4 views
-1

Ich baute diese Funktion, um eine Zeichenfolge Eingabe in Schwein Latein zu ändern. Ich habe versucht zu überprüfen, ob der Index außerhalb des Bereichs liegt, aber meine Methode der Überprüfung ist, dass der Index außerhalb des Bereichs liegt.Ich habe versucht zu überprüfen, ob der Index außerhalb des Bereichs liegt, aber der Code, den ich verwendet habe, gibt den Index außerhalb des Bereichs?

Siehe wie folgt:

def simple_pig_latin(input, sep=' ', end='.'): 
    words=input.replace(" ", " ").split(sep) 
    new_sentence="" 
    Vowels= ('a','e','i','o','u') 
    Digit= (0,1,2,3,4,5,6,7,8,9) 
    cons=('b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z') 
    characters= ('!','@','#','$','%','^','&','*','.') 
    for word in words: 
     if word[0] == " ": 
      new_word=word 
     else: 
      if word[0] in Vowels: 
       new_word= word+"way" 
      if word[0] in Digit: 
       new_word= word 
      if word[0] in cons: 
       first_letter=word[0] #saves the first letter 
       change= str(word) #change to string      
       rem= change.replace(first_letter,'') 
       put_last= rem+first_letter #add letter to end 
       new_word= put_last+"ay" 
      if word[0] in characters: 
       new_word= word 
      new_sentence= new_sentence+new_word+sep 

new_sentence= new_sentence.strip(sep)+end 
return new_sentence 

Sie die ersten sehen, ob Anweisung überprüft wird, wenn er leer ist, aber ich bin genau diesen Fehler bekommen:

„Linie 9 Indexerror: string Index aus des Bereichs "

Wie kann ich sonst nach der leeren Sequenz suchen? Ich kann nicht für Wort in Bereich (len (Wörter)) verwenden, weil dann keiner meiner if-Anweisungen funktioniert. Es wird mir sagen, dass das Objekt nicht eingruppierbar ist.

+1

„Sie können sehen, Die erste if-Anweisung überprüft, ob sie leer ist. "Nein, ist es nicht. Es versucht auf 'word [0]' zuzugreifen und zu sehen, ob 'word [0]' ein Leerzeichen ist. Es nimmt an, dass "Wort [0]" existiert. Das ist nichts wie ein Test, wenn "Wort" leer ist. – user2357112

+0

Aus welchem ​​Grund wurde diese Frage abgelehnt? Ich möchte meinen Fehler beheben, damit er keine schlechten Stimmen bekommt. –

Antwort

1

in der Schleife übernehmen Sie, dass word nicht leer ist, was überhaupt nicht gewährleistet ist, weil Sie Aufteilung nach Raum und leere Felder ausgegeben werden, wenn mehr als 1 Raum sind.

>>> "a b".split(" ") 
['a', '', 'b'] 

So könnte man split() ohne Argument verwendet (funktioniert nur für raumartige Zeichen) oder wenn Sie einen anderen Separator verwenden, herauszufiltern leere Felder vor der Schleife, zum Beispiel in einer Liste Verständnis:

words= [ w for w in input.split(sep) if w ] 

Jetzt sind Sie sicher, dass jedes Element von words mindestens 1 Zeichen hat.

EDIT: so viel für die schöne Erklärung über split und leere Strings Ausfiltern, aber das scheint nicht zu schneiden, da Sie l als Separator für hello world, also zurück zu den Wurzeln verwenden:

def simple_pig_latin(input, sep=' ', end='.'): 
    words=input.split(sep) 
    new_sentence="" 
    Vowels= ('a','e','i','o','u') 
    Digit= (0,1,2,3,4,5,6,7,8,9) 
    cons=set(('b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z')) 
    characters= ('!','@','#','$','%','^','&','*','.') 
    new_sentence = [] 

    for word in words: 
     if word: 
      if word[0] == " ": 
       new_word=word 
      else: 
       if word[0] in Vowels: 
        new_word= word+"way" 
       elif word[0] in Digit: 
        new_word= word 
       elif word[0] in cons: 
        first_letter=word[0] #saves the first letter 
        change= str(word) #change to string 
        rem= change.replace(first_letter,'') 
        put_last= rem+first_letter #add letter to end 
        new_word= put_last+"ay" 
       elif word[0] in characters: 
        new_word= word 
       new_sentence.append(new_word) 
     else: 
      new_sentence.append(word) 

    return sep.join(new_sentence)+end 

Änderungen an Ihrem Code:

  • Verwendung einer Liste, und kommen leeres Wort mit join am Ende zurück
  • filtert gerade aus, aber es in der legt Liste sowieso
  • viele elif statt if
  • ein set für consomns für schnelleren Lookup

jetzt mit:

print(simple_pig_latin("hello world",sep='l')) 

ergibt:

ehayllo worwaylday. 
+0

Das löste den Fehler außerhalb des zulässigen Bereichs! Ich versage immer noch diesen Testfall: AssertionError: 'ehaylo worwayday'! = 'Ehaylo worwayday' Ich weiß, dass dies etwas mit dem Trennzeichen = "l" zu tun hat.Wenn ich Streifen wegnehme, versage ich alle Testfälle, also wie kann ich das extra l behalten? –

+0

Es sagt mir, dass ich nicht für diese endgültige return-Anweisung verketten kann. TypeError: kann Liste nur verketten (nicht "str") zu Liste –

+0

Ich habe das getestet. Vielleicht hast du meine Lösung (mit einem Tippfehler) einfach neu abgetippt, anstatt sie zu kopieren/einzufügen. –

Verwandte Themen