2016-04-19 3 views
1
def romanToNum(word): 
    word = word.upper() 

    numeralList2 = list(zip(
     [1000, 500, 100, 50, 10, 5, 1], 
     ['M', 'D', 'C', 'L', 'X', 'V', 'I'] 
    )) 
    num = 0 
    x = [] 
    a = 0 
    b = 2 


    if len(word) % 2 != 0: 
     word = word + "s" 

    for i in range(0,len(word)): 
     x.append(word[a:b]) 
     a = a + 2 
     b = b + 2 
     print(x[i]) 

    for n in x: 
     for nNum,rNum in numeralList2: 
      if n == rNum: 
       num = nNum + num 
      elif n == (n[0] + n[1]): 
       num = (nNum*2) + num    
      elif n[0] == rNum: 
       r1 = 0 
       r1 = nNum 
      elif n[1] == rNum: 
       r2 = 0 
       r2 = nNum 
      elif r1 < r2: 
       num = num + (r2 - r1) 
      elif r1 > r2: 
       num = num + (r1 + r2)    
    return num   

romanToNum("xxx") 

Я получаю следующее сообщение об ошибке:Индекс струны выходит за пределы диапазона?

elif n == (n[0] + n[1]): 
IndexError: string index out of range 

и это не имеет значения, где я положил, что в петлю, он просто не узнает, что n имеет значение индекса.

Я также получаю эту ошибку: Traceback (most recent call last):

который указывает, когда я называю свою функцию: romanToNum("xxx")

Я не совсем уверен, что это происходит потому, что я добавил print заявление, где я добавления мой список и там индекс не менее [0], когда я распечатываю все это. Любая помощь здесь?

Я просмотрел стек для подобных вопросов, но решение для них - отступы или потому, что у них есть отрицательный индекс ([-1]) или что-то в этом роде, но все мои отступы верны, и мой индекс все положительный.

+0

'n [1]' будет с этой ошибкой, если нет индекса не менее '[1]'. Если вы добавите 'print (n)' в начале цикла for, вы увидите, что 'n' имеет длину всего один символ (и, следовательно, не имеет индекса' 1'), когда вы получаете это исключение. – dimo414

+0

@ dimo414 Почему? Я добавил его так, что, когда петли for пробегают мой список ** (x) **, значение «n» будет содержать строку с двумя символами, когда она пробегает циклы. – user3882522

+0

@ user3882522 Как я покажу в своем ответе, что на самом деле не работает, потому что вы делаете слишком много итераций при создании 'x', и вы в конечном итоге добавляете пустые строки в конец списка. – Bakuriu

ответ

1

Ну n является элементом x. IndexError на линии n == n[0] + n[1] означает, что определенный n имеет длину менее 2.

Вы добавили word = word + 's', чтобы, возможно, защититься от наличия одного символьного элемента в x, но на самом деле это не работает.

Если вы посмотрите на то, как вы строите x список вы делаете:

x = [] 
a = 0 
b = 2 


if len(word) % 2 != 0: 
    word = word + "s" 

for i in range(0,len(word)): 
    x.append(word[a:b]) 
    a = a + 2 
    b = b + 2 
    print(x[i]) 

Таким образом, в вашем примере вы начинаете с x = [] и word = 'XXX'. Затем вы добавляете s для получения word = 'XXXs'.

Цикл над i выполняет следующие действия:

  • i=0x.append(word[0:2]); a = a+2; b = b+2 так, так что x = ['XX'] и a=2 и b=4.

  • i=1 так x.append(word[2:4]); a = a+2; b = b+2 так что x = ['XX', 'Xs'] и a=4 и b=6.

  • i=2 так x.append(word[4:6]); a = a+2; b = b+2x = ['XX', 'Xs', ''] так что и a=6 и b=8.
  • i=3 так x.append(word[6:8]); a = a+2; b = b+2 так, что x = ['XX', 'Xs', '', ''] и a=8 и b=10.

И вот вы видите, что n может быть пустая строка, которая означает, что при выполнении n == n[0] + n[1] вы в конечном итоге с IndexError.

Я считаю, что вы хотите, чтобы сгруппировать символы, два на два, а затем i следует использовать шаг 2:

for i in range(0, len(word), 2): 
    x.append(word[i:i+2]) 

Таким образом i является 0, то 2, то 4 и т.д.


Кстати: как только вы исправили это условие, n == n[0] + n[1] кажется довольно странным, потому что если n является двухсимвольным string (как и должно быть, если вы исправите код), тогда условие всегда будет истинным. Что вы на самом деле пытаетесь сделать здесь?

+0

У вас есть точка, спасибо за указание на это. – user3882522

+0

Теперь я помню, я проверял, если группы из двух, где то же самое. поэтому, если бы я был помещен в «xx», тогда он имел бы значение true и умножал соответствующее значение на 2, поэтому в этом случае это было бы 20. По крайней мере, это то, что я пытался сделать. – user3882522

+0

У меня есть немного немного больше проблем с моим кодом, позаботьтесь о помощи? – user3882522

1

Это преступник:

for i in range(0,len(word)): 
    x.append(word[a:b]) 
    a = a + 2 
    b = b + 2 

В конце этого цикла, х будет ['XX', 'Xs', '', '']. Поскольку вы группируете символы в группах по два, общее количество групп будет на половину длины строки. Так что уменьшите количество итераций на две части с помощью range(0,len(word)/2) или range(0,len(word),2)

1

У вас возникла проблема с первым циклом цикла, который идет дальше, чем ожидалось, что влияет на пустую строку до x[i]. Вероятно, это должно быть: for i in range(int(len(word)/2)):

Тогда ваш второй цикл также нуждается в фиксации.

if n == rNum : не реализуется, так как rNum является символьной строкой, а длина x равна 2. Попробуйте n == rNum+"s". n == n[0] + n[1] всегда верно для строки из 2 символов. Вы должны иметь значение n == rNum * 2

Кроме того, рекомендуется использовать x += 1 вместо x = x + 1.

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