для цикла в Python, измените список, который он зацикливал - PullRequest
0 голосов
/ 30 мая 2018
cleanedList = [x for x in range(0, 100, 1)]   
idx = 0

for val in cleanedList:     
   check = abs(cleanedList[idx])
   idx = idx + 1

   if check % 5 == 0: #####  Conditions changed and change the list

       cleanedList = a new list that loops over.

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

Ответы [ 3 ]

0 голосов
/ 30 мая 2018

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

for val in cleanedList[:]:

, и вы можете вносить любые изменения в исходный список cleanedList, и никаких ошибок не будет.

0 голосов
/ 30 мая 2018

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

cleanedList = list(range(0, 100, 1))   
for i, _ in enumerate(cleanedList):     
   check = abs(cleanedList[i])
   if check % 5 == 0: #####  Change the list it is looping now
       cleanedList[:] = range(60, 100, 2)
0 голосов
/ 30 мая 2018

Это интересно, потому что вы на самом деле не мутировали список.

cleanedList = [x for x in range(0, 100, 1)]  # Creates list1
idx = 0

for val in cleanedList:  # begin iterating list1.  It's stored internally here.
   check = abs(cleanedList[idx])
   print val, check, 
   idx = idx + 1
   if check < 30: #####  Change the list it is looping now
       cleanedList = [x for x in range(60,100,2)]  # reassign here, but it becomes list2.

Вывод рассказывает историю:

0 0 1 62 2 64 3 66 4 68 5 70 6 72 7 74 8 76 9 78 10 80 11 82 12 84 13 86 14 88 15 90 16 92 17 94 18 96 19 98

Поскольку вы не мутировали,Вы переназначили, висящая ссылка на список, который вы перебираете изначально, все еще существует для контекста цикла for, и она продолжается далеко за концом списка 2, поэтому в конечном итоге вы выбрасываете IndexError - есть 100 элементовв вашем первом списке, и только 20 в вашем втором списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...