2016-03-27 12 views
0

Ich versuche, eine einfache Rechtschreibprüfung Programm durch zwei Strings und passen Sie die erste an die zweite. Wenn die Strings die gleiche Länge haben, funktioniert mein Code gut, aber wenn sie unterschiedlich sind, beginnen die Probleme. Es führt die if-Anweisungen nur einmal aus und stoppt danach. Wenn ich die Break-Punkte entferne, bekomme ich einen IndexError: List-Index außerhalb des Bereichs.Python if Anweisung wird nur einmal ausgeführt

Hier ist mein Code:

#!python 
# -*- coding: utf-8 -*- 

def edit_operations(first,second): 

    a = list(first) 
    b = list(second) 
    counter = 0 
    l_a = len(a) 
    l_b = len(b) 

    while True: 
      if a == b: 
        break 

      if l_a > l_b: 
        if a[counter] != b[counter]: 
          a[counter] = "" 
          c = "".join(a) 
          print "delete", counter+1, b[counter], c 
          counter += 1 
          l_a -= 1 
          break 

      if l_a < l_b: 
        if a[counter] != b[counter]: 
          c = "".join(a) 
          c = c[:counter] + b[counter] + c[counter:] 
          print "insert", counter+1, b[counter], c 
          counter += 1 
          l_a += 1 
          break  

      if a[counter] != b[counter]:      
        a[counter] = b[counter] 
        c = "".join(a) 
        print "replace", counter+1, b[counter], c 
        counter += 1 

      else: 
        counter += 1 

if __name__ == "__main__": 

    edit_operations("Reperatur","Reparatur") 
    edit_operations("Singel","Single") 
    edit_operations("Krach","Stall") 
    edit_operations("wiederspiegeln","widerspiegeln") 
    edit_operations("wiederspiglen","widerspiegeln") 
    edit_operations("Babies","Babys") 
    edit_operations("Babs","Babys") 
    edit_operations("Babeeees","Babys") 

Dies ist die Ausgabe erhalte ich:

replace 4 a Reparatur 
replace 5 l Singll 
replace 6 e Single 
replace 1 S Srach 
replace 2 t Stach 
replace 4 l Stalh 
replace 5 l Stall 
delete 3 d widerspiegeln 
replace 3 d widderspiglen 
replace 4 e wideerspiglen 
replace 5 r widerrspiglen 
replace 6 s widersspiglen 
replace 7 p widersppiglen 
replace 8 i widerspiiglen 
replace 9 e widerspieglen 
replace 11 e widerspiegeen 
replace 12 l widerspiegeln 
delete 4 y Babes 
insert 4 y Babys 
delete 4 y Babeees 

Durch die letzten drei Zeilen können Sie mein Problem sehen und ich bin irgendwie jetzt verzweifelt. Hoffentlich könnte jemand einen Tip geben Sie mir, was daran falsch ist

+0

Also was ist das Problem. Wir wissen nicht, was du zu tun versuchst. Bitte aktualisieren Sie Ihren Beitrag zusammen mit dem erwarteten Ergebnis. – Saleem

+0

Sie haben 'Break'-Anweisungen unter den' if's, wo die Längen unterschiedlich sind; Warum würden Sie erwarten, dass die Schleife weiterläuft? –

Antwort

0

Die Antwort auf die Frage im Titel verwenden müssen - dh die if-Anweisung wird nur einmal ausgeführt - steht bereits in einem Kommentar zu Ihrer Frage, das heißt, es gibt zwei break s in den beiden if Blöcken if l_a < l_b: und if l_a < l_b:. Im Allgemeinen unterbricht die break Anweisung die nächste Schleife, die gefunden wird, egal wie verschachtelt der Block ist, in dem sich break befindet.

Allerdings haben andere Probleme im Code angezeigt:

  • die Größe der Liste a wird gleich gehalten, aber die gleiche counter zur Iteration über die Buchstaben der beiden Strings verwendet wird. Wenn die Länge der beiden Strings unterschiedlich ist, führt dieses Problem schließlich zum Fehler IndexError: list index out of range, weil die einzige Bedingung, die es erlaubt, die Schleife zu verlassen, ist, wenn die beiden Strings gleich sind. Auch wenn l_a > l_b, das gleiche Zeichen von b, dass mit a nicht übereinstimmte sollte mit dem Zeichen neben dem gelöschten überprüft werden, aber dies geschieht nicht wegen der gleichen counter.

  • Wenn l_a < l_b die Liste a nicht geändert wird; nur eine neue Liste c wird mit dem zusätzlichen Buchstaben erstellt. Bitte schauen Sie sich list documentation an.

  • counter wird nicht korrekt aktualisiert, da, wenn die zwei Strings in der Länge unterscheiden, wird es nur erhöht, wenn die Buchstaben unterschiedlich sind. Dies führt zu einer Endlosschleife.

Im Allgemeinen sollten Sie einen Debugger, um mit den Fragen, um herauszufinden, (Blick auf den verfügbaren Debugger in Python https://wiki.python.org/moin/PythonDebuggingTools). Es ist möglich, online oder in einem Buchladen viele Ressourcen zu finden, um zu lernen, wie man Code debuggt.

+0

Danke für deine Antwort, ich denke ich verstehe jetzt was ich falsch gemacht habe. Und danke, dass du mir dieses Debugging-Tool vorgeschlagen hast, ich habe nach so etwas gesucht. – Christoph

-5

Ich weiß nicht wirklich verstehen, was Ihre Frage ist aber, wenn Sie eine Rechtschreibprüfung nur diese library

+5

In welcher Weise ist das eine Antwort auf die Frage? –

0

Sie sollen Verwendung der list.insert() Funktion machen ein Zeichen in die Liste einzufügen, die del Bediener ein einzelnes Zeichen aus der Liste zu entfernen, und den a == b Vergleich in die while Schleife bedingt bewegen. Die Variable counter sollte den Index des nächsten zu vergleichenden Zeichens anzeigen und sollte nicht inkrementiert werden, wenn die Zeichen nicht gleich sind.Wie folgt:

#! python3 

def edit_operations(first,second): 
    a = list(first) 
    b = list(second) 
    counter = 0 

    while a != b: 
     if a[counter] != b[counter]: 
      if len(a) > len(b): 
       print("delete", counter + 1, a[counter]) 
       del a[counter] 
      elif len(b) > len(a): 
       print("insert", counter + 1, b[counter]) 
       a.insert(counter, b[counter]) 
      else: 
       print("replace", counter + 1, b[counter]) 
       a[counter] = b[counter] 
     else: 
      counter += 1 
    print("".join(a)) 

if __name__ == "__main__": 
    edit_operations("Reperatur","Reparatur") 
    edit_operations("Singel","Single") 
    edit_operations("Krach","Stall") 
    edit_operations("wiederspiegeln","widerspiegeln") 
    edit_operations("wiederspiglen","widerspiegeln") 
    edit_operations("Babies","Babys") 
    edit_operations("Babs","Babys") 
    edit_operations("Babeeees","Babys") 

Ich habe die Druckanweisungen ein wenig geändert.

+0

Danke für die Hilfe, ich denke, ich habe es jetzt. – Christoph

Verwandte Themen