2016-10-28 4 views
0

Ich bin sehr neu in Python und durch einige Kursmaterial und schrieb diese Funktion, um ein bestimmtes Zeichen aus der Zeichenfolge zu entfernen, egal wie oft das Zeichen in der Zeichenfolge ist.Remove letter from string

def remove_letter(): #Remove a selected letter from a string 
    base_string = str(raw_input("Enter String: ")) 
    letter_remove = str(raw_input("Enter Letter: ")) #takes any size string 
    letter_remove = letter_remove[0] 
    string_length = len(base_string) 
    location = 0 

    while (location < string_length): #by reference (rather than by value) 
     if base_string[location] == letter_remove: 
      base_string = base_string[:location] + base_string[location+1::] 
      string_length -= 1 
     location+=1 

    print "Result: %s" % base_string 
    return 

Hier ist das, was ich nicht verstehen, wenn ich „asdfasdfasdf“ setzen in der Zeichenfolge und wählen Sie dann den Buchstaben „D“ zu entfernen, es funktioniert perfekt. Wenn Sie jedoch "Hello" in die Zeichenfolge einfügen und den Buchstaben "l" entfernen, wird nur ein "l" entfernt und das Ergebnis lautet "Helo". Ich kann nicht verstehen, warum es funktioniert, wenn ich "asdfasdfasdf" und jetzt "Hallo" setze

+0

Warum nicht eine eingebaute Funktion für diese anstelle der eigenen Erstellung verwenden? ''ababa'.replace (' a ',' ') =>' bb'' – Nicarus

+0

Ich lerne jetzt Python, ich bin sicher, es gibt eine Reihe von verschiedenen Möglichkeiten, dies zu tun und viel einfacher, aber ich mag es zu lernen verschiedene Dinge ausprobieren, um zu sehen, wie alles funktioniert, und ich wollte wirklich herausfinden, warum das nicht funktioniert – Mafioso1823

+0

Wenn Sie gerade jetzt Python lernen, würde ich persönlich empfehlen, dass Sie mit Python 3 statt 2 lernen. – Nicarus

Antwort

0

Das Problem ist, dass Sie location+=1 außerhalb Ihrer if-Anweisung haben.

Ihr Code, wie er ist, überspringt den Buchstaben nach einem entfernten Buchstaben.

Da Sie sowohl string_length -= 1 UND location+=1 in einer Iteration tun, wenn Sie einen Buchstaben entfernen, verschiebt location effektiv zwei Indizes.

Um es zu beheben, müssen Sie ein wenig mehr als nur das tun, da location+=1 auch außerhalb dieser if-Anweisung erforderlich ist.

Ich habe gerade erklärt, was schief lief, und ich muss jetzt laufen, aber ich sehe, dass einige andere Leute Ihnen bereits Lösungen gegeben haben, also mache ich mir keine Sorgen. Viel Glück!

+0

Hast du das getestet? Es ergibt sich eine ewige Schleife – Wondercricket

+0

ja, ich habe es getestet, und es funktioniert, wenn die Zeichenfolge "asdfasdfasdf" verwenden und versuchen, "d" zu entfernen, funktioniert aber nicht, wenn ich "Hallo" verwende und versuchen, "l" zu entfernen – Mafioso1823

+0

Entschuldigung , musste für einen Moment weggehen, bevor ich meine Bearbeitungen beenden konnte. –

-1

Sie könnten immer Zeichenfolge ersetzen.

base_string.replace(letter_remove,"") 
0

Betrachten

#base_string is 'Hello', location is 2 and string_length is 5. 
base_string = base_string[:location] + base_string[location+1::] #'Helo' 

Dann Sie die String-Länge reduzieren und die Position zu erhöhen. Sie haben Standort ist 3, aber 'Helo'[3] == 'o' nicht 'l'. Wenn Sie ein Element aus Ihrer Zeichenfolge entfernen, verschieben Sie im Wesentlichen alle verbleibenden Zeichen um 1. Daher sollten Sie location nicht aktualisieren, da es jetzt bereits auf das nächste Zeichen zeigt.

while (location < string_length): #by reference (rather than by value) 
    if base_string[location] == letter_remove: 
     base_string = base_string[:location] + base_string[location+1::] 
     string_length -= 1 
    else: 
     location+=1 
0

Es ist ein Fehler. Es funktioniert nur dann nicht richtig, wenn das gleiche Zeichen nacheinander angezeigt wird.

  1. Hello, ignoriert er die zweite l in Hallo, wenn es die erste traf l
  2. Wenn Sie Helol versuchen, wird es beide l s entfernen.
  3. Wenn Sie versuchen Helllo, das Ergebnis wäre Helo.

Lösung: Wenn Sie den Ziel Brief stoßen, entfernen Sie sie und den Rest Zeichen Ihrer aktualisierten String iterieren andere als location

continue Ihr Problem behebt hinzufügen zu erhöhen.

while (location < string_length): #by reference (rather than by value) 
    if base_string[location] == letter_remove: 
     base_string = base_string[:location] + base_string[location+1::] 
     string_length -= 1 
     continue 
    location+=1 

Test:

python2 test.py                     Fri 28 Oct 14:25:59 2016 
Enter String: Hello 
Enter Letter: l 
Result: Heo 
Verwandte Themen