Страницы

Поиск по вопросам

воскресенье, 8 марта 2020 г.

Почему индекс в методе pop находится вне границы?

#python


import random
WORDS = ["Svitanok", "hogog", "gfgfgfg", "sdasd", "adam"]
newwords = []
length = len(WORDS)
newpos = ""
while WORDS:
  newpos = random.randint(0, length-1)
  newwords.append(WORDS.pop(newpos))
  WORDS.remove(WORDS[newpos])
print(newwords)


В общем, писал алгоритм для вывода списка WORDS в случайном порядке. И наткнулся
на ошибку "pop index out of range". Не могу понять, почему метод выходит за границы?
P.S. Про shuffle я знаю, просто хочу написать код таким способом. 
    


Ответы

Ответ 1



remove не нужно вызывать, pop уже удаляет элемент из списка. Кроме этого, значение length нужно обновлять на каждой итерации, тк список WORDS изменяет свой размер.

Ответ 2



Раз: допустим, после нескольких итераций WORDS у нас стал ["Svitanok"]. 1) newpos = random.randint(0, length-1) newpos может быть 0, 1, 2, 3 или 4, потому что length=5 (никто эту переменную не менял) и length-1=4, а randint включает обе границы в интервал, из которого выбирается число. Допустим, newpos выпало 4. 2) newwords.append(WORDS.pop(newpos)) "Svitanok" это 0. Элементов, соответствующих индексам 1, 2, 3 или 4 здесь уже нет. А newpos у нас выпало как раз 4 — всё, выход за правый предел списка, pop падает. Два: пройдёмся с самого начала с другой ситуацией 1) newpos = random.randint(0, length-1) Допустим, пусть там выпадет 4 2) newwords.append(WORDS.pop(newpos)) WORDS = ["Svitanok", "hogog", "gfgfgfg", "sdasd"] newwords = ["adam"] 3) WORDS.remove(WORDS[newpos]) "Svitanok" это 0, "hogog" это 1, "gfgfgfg" это 2, "sdasd" это 3. А newpos у нас 4. Вот, собственно, и всё, WORDS[newpos] падает, ибо 4 это выход за правый предел списка. Правильный код: import random WORDS = ["Svitanok", "hogog", "gfgfgfg", "sdasd", "adam"] newwords = [] while WORDS: newpos = random.randint(0, len(WORDS) - 1) newwords.append(WORDS.pop(newpos)) print(newwords)

Комментариев нет:

Отправить комментарий