2016-02-24 2 views
1

Я делаю функцию, которая принимает в строке и возвращает все возможности выходов, используя следующие преобразования:индекса питона вне диапазона для хелпер/функций

o -> 0 i,l -> 1 
z -> 2 e -> 3 
a -> 4 s -> 5 
b -> 6 t -> 7 
b -> 8 g,q -> 9 

Например:

print(transform_digits("Bow")) 
['Bow', 'B0w', '6ow', '60w', '8ow', '80w'] 

Вот функция помощник, который я использую, чтобы получить преобразование строки st при индексе i:

def position_transform(st,i): 
    letter=st[i] 
    front = st[:i] 
    back=st[(i+1):] 
    l=[] 
    if (letter=="o" or letter=="O"): l.append(front+"0"+back) 
    elif (letter=="z" or letter=="Z"): l.append(front+"2"+back) 
    elif (letter=="a" or letter=="A"): l.append(front+"4"+back) 
    elif (letter=="b" or letter=="B"): 
     l.append(front+"6"+back) 
     l.append(front+"8"+back) 
    elif (letter=="i" or letter=="I"or letter=="l" or letter =="L"): l.append(front+"1"+back) 
    elif (letter=="e" or letter=="E"): l.append(front+"3"+back) 
    elif (letter=="s" or letter=="S"): l.append(front+"5"+back) 
    elif (letter=="t" or letter=="T"): l.append(front+"7"+back) 
    elif (letter=="g" or letter=="G"or letter=="q" or letter =="Q"): l.append(front+"9"+back) 
    return l 

Вот основные функции:

def transform_digits(st): 
    l=[] 
    l.append(st) 
    newl=l[:] 
    length=len(st) 
    for x in range(0,length): 
     for i in l: 
      s=position_transform(i,x) 
      newl.append(s) 
     l=newl[:] 
    return l 

при запуске основной функции я получаю:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 8, in transform_digits 
    File "<stdin>", line 2, in position_transform 
IndexError: list index out of range 

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

ответ

0

Вопрос newl.append(s). Вы добавляете результат своего position_transform(i,x) в свой список, за исключением position_transform, который возвращает список, поэтому вы получаете списки внутри списков. Это означает, что по линии вы пытаетесь сделать position_transform и передать список вместо строки. В списке только несколько (1-2) элементов в нем, гораздо меньше, чем строка будет иметь символы, что приведет к вашему IndexError.

Если вы хотите добавить содержимое списка в другой список, используйте [1:1]slice, поэтому ваше задание станет newl[1:1] = s. Так что ваш вложенная for-loop теперь выглядит следующим образом:

for x in range(0,length): 
    for i in l: 
     s=position_transform(i,x) 
     newl[1:1] = s 
    l=newl[:] 

Это делает программу выполнять хорошо, насколько я могу судить.

В будущем я рекомендую использовать более дескриптивные имена переменных и пытаться прокомментировать ваш код при его написании. В противном случае вы можете в конечном итоге посмотреть на то, что вы написали 5 минут назад, задаваясь вопросом, что там происходит. Написание поддерживаемого кода очень важно!

+0

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

+0

Специально при задании вопросов о переполнении стека, чем читабельнее ваш код, тем больше вероятность получить помощь (и быстрее) :) – mech

+0

Вы имеете в виду 'newl.extend (s)'? – Aprillion

Смежные вопросы