2016-11-17 3 views
0

Я до сих пор новичок в мире кодирования, и иногда я борюсь с самыми легкими вещами ... Я написал следующий код, который дает мне ValueError: list.remove(x): x not in list, когда я хочу превышать его. Я уже перебираю копию исходного списка, поэтому я немного потерян. Вот код:Правильное использование функции remove() в Python + looping over copyList

def revrot(strng, sz): 
    if len(strng) == 0 or sz <= 0 or sz > len(strng): 
     return '' 
    else: 
     list = [] 
     for i in strng: 
      list.append(i) 
     rest = len(strng)%sz 
     for i in range(0,rest): 
      list.pop() 
     sum = 0 
     res = '' 
     while len(list) != 0: 
      copyList = list[:] 
      for i in range(0,sz): 
       sum += 1 
       if sum%2 == 0: 
        list2 = list[:sz] 
        list2.reverse() 
        res += ''.join(list2) 
        print(res) 
        for i in range(0,sz): 
         list.remove(copyList[i]) 
       else: 
        res += ''.join(list[1:]) + ''.join(list[0]) 
        for i in range(0,sz): 
         list.remove(copyList[i]) 
    return res 

Интересная часть начинается с цикла while. Я думал, что я написал функцию, которая удаляет элементы из list (в диапазоне (0: sz), поэтому в какой-то момент list пуст, и вот когда останавливается. То, что у меня не получается: почему моя команда remove() бросает что ValueError он отлично работает в консоли, когда я проверить его отдельно:.!

copyList 
Out[127]: ['1', '2', '3', '4', '5', '6', '7', '7', '9'] 

for i in range(0,4): 
    list.remove(copyList[i]) 

list 
Out[129]: ['5', '6', '7', '7', '9'] 

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

ответ

0

Вы делаете это неправильно. Вы удаляете элементы на основе индекса. Но вы забыли тот факт, что когда вы удаляете элемент по индексу n , ваш item n+1 будет n.

Здесь вы удаляете элементы из списка и продолжаете двигаться вперед. Если элемент в списке также обменивается назад. Таким образом, в точке вы получаете исключение IndexError, потому что индекс, который вы держите прямо сейчас для элемента, не находится в той позиции, которую вы ожидали. Он находится в перечеркнутом списке.

Давайте посмотрим на примере, так что он будет иметь больше смысла для вас:

>>> l = [1, 2, 3, 4, 5, 6, 7] 
>>> for i in range(len(l)): 
...  print 'index: ', i, 'list:', l 
...  del l[i] # better way to delete item in list based on index 
... 
index: 0 list: [1, 2, 3, 4, 5, 6, 7] 
index: 1 list: [2, 3, 4, 5, 6, 7] 
#    ^Item at zero index got deleted 
#     Now 2 is at index zero 

index: 2 list: [2, 4, 5, 6, 7] 
#    ^^ This time deleted item 3, because that is at index 2 

index: 3 list: [2, 4, 6, 7] 
index: 4 list: [2, 4, 6] 
Traceback (most recent call last): 
    File "<stdin>", line 3, in <module> 
IndexError: list assignment index out of range 

В конце концов, это вызывает ошибку индекса, потому что даже если начальная длина списка была 7, когда i был 4 длины из списка 3

+0

Спасибо за ваш ответ, @MoinuddinQuadri. Я думал, что избавился от этой проблемы, используя copyList [i] в ​​команде remove, так как он не ищет индекс диапазона, вместо этого он идет для copyList [0] = 1 и т. Д., И потому, что я перебираю copyList, а не список диапазона остается оригинал, нет? –

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