2013-05-30 3 views
0

Здравствуйте, мне немного сложно понять, почему индекс строки указан как «вне диапазона». Рассмотрим строку, которую я пытаюсь перевести этот код:Ошибка индекса строки вне диапазона?

a = str("g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.") 
b = 0 
while True: 
    if a[b] == str("k"): 
     a.replace("k", "m") 
     b = b + 1 #Methodically checks each string for a 'k' and replaces it with a 'm' 
    elif a[b] == str("o"): 
     a.replace("o", "q") 
     b = b + 1#Checks for an 'o' and replaces with 'q' 
    elif a[b] == str("e"): 
     a.replace("e", "g") 
     b = b + 1 
    else: 
     b = b + 1 
     continue 
     if b == 202: 
      print(a) 
      break 
+4

Вам не нужно включать строки в строки здесь (просто используйте '== 'k''). –

+1

Ах, старый добрый вызов на питоне! –

+0

'a.replace (...)' is no op .... Итак, я полагаю, что ваши подсчеты будут неправильными –

ответ

4

Вы никогда не достигают вашего break заявление в конце цикла, потому что вы попали в continue первый и перейти к следующей итерации. Просто вытащите continue, и все должно быть установлено.

else: 
    b = b + 1 
    if b == 202: 
     print(a) 
     break 

Я также рекомендую использовать "магическое" число, как 202 здесь. Вместо этого, определить динамически ли вы в конце строки, используя len функцию:

if b == len(a)-1: 
    break 

Или еще лучше, воспользоваться тем, что вы можете легко перебирать строки в Python:

for ch in a: 
    # Do stuff 

Как уже говорилось в комментариях, ваша логика также недостатки (replace будет просто идти по всей строки в любом случае!), и вам не нужны все эти str(...) звонки там. Вся ваша функция может быть переписана в виде:

newstring = '' 
for ch in a: 
    if ch == 'k': 
     newstring += 'm' 
    elif ch == 'o': 
     newstring += 'q' 
    elif ch == 'e': 
     newstring += 'g' 
    else: 
     newstring += ch 
print newstring 

Или еще лучше, просто использовать функцию replace так, как это означало быть использованы:

print a.replace('k', 'm').replace('o', 'q').replace('e','g') 
2

есть «продолжать» до разрыва «, если "сравнение. поэтому он, вероятно, никогда не попадет в if, и он никогда не сломается.

0

Строка - это последовательность в python, вы можете перебирать ее.

Во-вторых, поскольку строки являются неизменяемыми, поэтому str.replace не изменяет a, он просто возвращает новую строку.

a = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj." 

for char in a:  
    if char == "k": 
     a = a.replace("k", "m") #assign the new string back to `a` 
    elif char == "o": 
     a = a.replace("o", "q") 
    elif char == "e": 
     a = a.replace("e", "g") 
print a 
+0

Ой, если строки неизменяемы, то как я это расшифрую? –

+0

@EfeEsenwa использует 'a = a.replace (" k "," m ")', он переназначает новую строку на 'a'. См. Мое решение. –

0

Ваш continue продолжает цикл такой, что if b == 202 утверждение никогда не достигается.

Попробуйте это:

a = str("g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.") 
b = 0 
while True: 
    if a[b] == str("k"): 
     a.replace("k", "m") 
     b = b + 1 
    elif a[b] == str("o"): 
     a.replace("o", "q") 
     b = b + 1 
    elif a[b] == str("e"): 
     a.replace("e", "g") 
     b = b + 1 
    else: 
     b = b + 1 
     #continue 
    if b == 202: 
     print(a) 
     break 
+2

Где исправить? – alexpinho98

+0

@ alexpinho98 К сожалению. ошибка копирования-вставки. Благодарю. –

0

Потому что вы не вырваться из петли.

else: 
    b = b + 1 
    continue 
    if b == 202: 
     print a 
     break 

Вы проводите тест только в том случае, если вы доберетесь до другого и не каждый раз. Отключить последние 3 строки вашего кода, чтобы заставить его работать. Если у вас все еще проблема, это потому, что вы продолжаете в предложении else: удалите ее.

0

Поскольку вы достигаете continue, заявление if b == 202 никогда не будет достигнуто.

Однако s.replace(old, new) заменяет все вхождения old с new, так что вам не нужно перебирать над ним:

a = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj." 

a = a.replace('k', 'm') 
a = a.replace('o', 'q') 
a = a.replace('e', 'g') 

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

replacements = {'k': 'm', 'o': 'q', 'e': 'g'} 
for old, new in replacements.items(): 
    a = a.replace(old, new) 

В качестве альтернативы, вы можете просто создать два списка и zip их:

olds, news = ['k', 'o', 'e'], ['m', 'q', 'g'] 
for old, new in zip(olds, news): 
    a = a.replace(old, new) 
0

Просто к сведению, путь Pythonic написания кода (если я понимаю его намерение должным образом) является:

from string import maketrans 
if len(a) >= 202: 
    print a[:202].translate(maketrans('koe', 'mqg')) + a[202:] 

Хотя я подозреваю, что b только в том, чтобы проверить, что вы в конце строки, так что, вероятно, просто:

print a.translate(maketrans('koe', 'mqg')) 
Смежные вопросы