2014-12-03 15 views
-2

В настоящее время я делаю программу для своего класса Python. Описание находится здесь:Нарезка строк не работает должным образом

Напишите короткую программу python, YI_swapOandE.py, чтобы заменить «o» на «e». Подскажите пользователю слово и покажите его измененную версию, если она содержит o. В противном случае программа просто отобразит исходное слово. Эта программа должна использовать технику среза, которую вы изучили в программе Hangman. Пример: Введите слово и я заменит любой «о» с «е»: метла обмениваемых слово: breem

До сих пор, после того, как она рассказала нам повторно использовать код, я это сделал :

def splicing(): 
    word = input("Please input a word") 
    for i in range(len(word)): 
     letter = word[i] 
     if letter == 'o': 
      word = letter[:i] + word[i] + letter[i+1:] 
    print(word) 


def main(): 
    splicing() 


main() 

Да, я понимаю, что некоторые биты не идеальны, но мне просто нужна помощь одним бит.

В настоящее время я получаю сообщение об ошибке: индекс строки из диапазона

, как это исправить?

+0

'letter [: i] + word [i] + letter [i + 1:]' похоже, что вы вставляете слово в середине буквы, а не наоборот. –

+0

'word = word [: i] + 'e' + word [i + 1:]' –

+2

Вы получаете цену за наименее говорящий заголовок сегодняшнего дня ;-) – Alfe

ответ

0

replace может делать то, что вы хотите достичь:

>>> "hello how are you".replace('o','e') 
'helle hew are yeu' 
>>> "broom".replace('o','e') 
'breem' 

некоторые изменения в код:

def splicing():  
    word = input("Please input a word") 
    modify = '' 
    for i in range(len(word)): 
     if word[i] == 'o': 
      modify += 'e' 
     else: modify += word[i] 
    print(modify) 

def main(): 
    splicing() 

main() 
+1

OP не перебирает строку. для i в диапазоне (len (word)) перебирает список целых чисел. – munk

+0

исправьте меня, где я ошибаюсь ?? – Hackaholic

+0

Вы говорите об изменении того, что вы зацикливаете, и этого просто не происходит в этом коде. – munk

0

Вы определили letter, чтобы быть один символ:

letter = word[i] 

Но то в этой строке:

word = letter[:i] + word[i] + letter[i+1:] 

... вы разрезаете его. В этом причина ошибки. Изменение обеих ссылок на letter в этой строке с word - это, вероятно, то, что вы пытаетесь сделать, но вам также нужно будет изменить одну ссылку на word, которую вы уже имеете там. (Подсказка: поскольку вы только нажимаете на внутреннюю часть этого блока, когда видите «o», вы точно знаете, что вы хотите туда пойти. Нет необходимости в переменной.)

3

Проблема заключается в letter = word[i]. Я думаю, вы сбиваете с толку, что это такое.

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

def splicing(): 
    word = input("Please input a word") 
    for i in range(len(word)): 
     letter = word[i] 
     if letter == 'o': 
      word = word[:i] + 'e' + word[i+1:] 
    print(word) 


def main(): 
    splicing() 


main()  
+0

Спасибо! Это сработало –

+0

Привет @StephendeRiel, если этот или любой ответ решил ваш вопрос, пожалуйста, рассмотрите [принятие его] (http://meta.stackexchange.com/q/5234/179419), нажав на галочку. Это указывает более широкому сообществу, что вы нашли решение и дали некоторую репутацию как самому, так и самому себе. Это не обязательно. – munk

1

Ваш код

def splicing(): 
    word = input("Please input a word") 
    for i in range(len(word)): 
     letter = word[i] 
     if letter == 'o': 
      word = letter[:i] + word[i] + letter[i+1:] 
    print(word) 

давайте посмотрим

 letter = word[i] 
     if letter == 'o': 

может быть упрощена

 if word[i] == 'o': 

теперь давайте посмотрим, что вы делаете, когда вы находите 'о'

  word = letter[:i] + word[i] + letter[i+1:] 

с помощью предыдущего использования letter у вас есть

  word = word[i] + word[i] + word[i] 

, и это не то, что вы хотите, в первую очередь потому, что вы не положить «е» в вашем слове ...

  word = word[:i]+'e'+word[1+1:] 

Подводя итоги

def splicing(): 
    word = input("Please input a word") 
    for i in range(len(word)): 
     if word[i] == 'o': 
      word = word[:i]+'e'+word[i+1:] 
    print(word) 

выше процедуру я на вашем текущем уровне, но это не эффективно, потому что вы снова и снова создаете строку, которая известна как word ... ее гораздо эффективнее преобразовать строку в структуру данных, которую можно изменить на месте, управлять замена и преобразовать обратно в строку

>>> word = 'Popeye & Olive' 
>>> l = [c for c in word] 
>>> print(l) 
['P', 'o', 'p', 'e', 'y', 'e', ' ', '&', ' ', 'O', 'l', 'i', 'v', 'e'] 

Теперь вы можете применить изменения при построении новой структуры данных:

>>> l = ['e' if c == 'o' else c for c in word] 
>>> print(l) 
['P', 'e', 'p', 'e', 'y', 'e', ' ', '&', ' ', 'O', 'l', 'i', 'v', 'e'] 

это очень читаемый, не так ли?

Теперь let'g пойти на шаг дальше и изменить также капитальной «O»

>>> l = ['e' if c == 'o' else 'E' if c == 'O' else c for c in word] 

это немного более сложным, но остается читаемым ...

>>> print(l) 
['P', 'e', 'p', 'e', 'y', 'e', ' ', '&', ' ', 'E', 'l', 'i', 'v', 'e'] 

, но это не то, что мы хотим, мы хотим строку!

Для этого питона предоставляет метод str.join() --- здесь мы хотим присоединиться элементы l используя пустую строку ""

>>> print("".join(l)) 
Pepeye & Elive 
>>> 

Если мы хотим, чтобы поставить все это вместе

>>> word = "".join(['e' if c=='o' else 'E' if c=='O' else c for c in word]) 
>>> print(word) 
Pepeye & Elive 
>>> 
Смежные вопросы