2016-10-28 9 views
0

Я очень новичок в python и просматриваю материал курса и написал эту функцию для удаления определенного символа из строки независимо от того, сколько раз этот символ находится в строке.Удалить письмо из строки

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 

Теперь вот что я не разобравшись, если я ставлю «asdfasdfasdf» в строке, а затем выбрать, чтобы удалить букву «D» он отлично работает. Но если поставить «Hello» в строке и выбрать удалить букву «l», она удалит только один «l», и результатом будет «Helo». Я не могу понять, почему он работает, когда я ставлю «asdfasdfasdf» и теперь «Hello»

+0

Почему бы не использовать встроенную функцию для этого вместо того, чтобы создавать свои собственные? ''ababa'.replace (' a ',' ') =>' bb'' – Nicarus

+0

Теперь я изучаю python, я уверен, что есть множество способов сделать это и намного проще, но мне нравится учиться попробовать разные вещи, чтобы увидеть, как все работает, и я действительно хотел узнать, почему это не работает. – Mafioso1823

+0

Если вы только сейчас изучаете Python, я лично рекомендую вам учиться с Python 3 вместо 2. – Nicarus

ответ

0

Проблема в том, что у вас есть location+=1 вне вашего оператора if.

Ваш код as-is пропускает письмо после удаленной буквы.

Так как вы делаете как string_length -= 1 И location+=1 на итерации, когда вы удаляете письмо, location эффективно перемещает два индекса.

Чтобы исправить это, вам нужно сделать немного больше, чем просто, так как location+=1 ТАКЖЕ требуется за пределами этого if-statement.

Я только что объяснил, что случилось, и я должен бежать прямо сейчас, но я вижу, что некоторые другие люди уже дали вам решения, поэтому я не волнуюсь. Удачи!

+0

Вы проверили это? Это приводит к вечному циклу – Wondercricket

+0

Да, я проверил его, и он работает, если используется строка «asdfasdfasdf» и попытаться удалить «d», но не работает, если я использую «привет» и пытаюсь удалить «l» – Mafioso1823

+0

Извините , должен был уйти на минутку, прежде чем я смог закончить свои правки. –

-1

Вы всегда можете использовать замену строк.

base_string.replace(letter_remove,"") 
0

Рассмотрим

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

Затем уменьшить длину строки и приращение местоположения. У вас есть место 3, но 'Helo'[3] == 'o' не 'l'. Когда вы удаляете элемент из своей строки, вы по существу меняете все остальные символы на 1, поэтому вы не должны обновлять location, поскольку он уже будет указывать на следующий символ.

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

Это ошибка. Он работает неправильно, только когда один и тот же символ появляется последовательно.

  1. Hello, он игнорирует в Привет второй l, когда он встретил первую l
  2. Если вы пытаетесь Helol, это приведет к удалению обоих l с.
  3. Если вы попробуете Helllo, результатом будет Helo.

Решение: Когда вы сталкиваетесь с целевым письмом, удалить его и продолжать Итерируя отдых символов обновленной строки, кроме увеличения location

Добавить continue исправит проблему.

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 

Тест:

python2 test.py                     Fri 28 Oct 14:25:59 2016 
Enter String: Hello 
Enter Letter: l 
Result: Heo 
Смежные вопросы