Как выполнять итерации в определенном порядке?

#python #loops #for-loop #iteration #next

#python #циклы #for-цикл #итерация #Далее

Вопрос:

Мне интересно, как я могу выполнять итерации по списку в определенном порядке в Python.

Учитывая список, lst = [1, 3, -1, 2] , я хочу, чтобы моя функция выполняла итерацию таким образом, чтобы следующее число, которое повторяется, было индексом значения текущего числа.

lst[0] -> lst[1] -> lst[3] -> lst[2] 1 -> 3 -> 2 -> -1

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

1. Это один из тех вопросов, которые практически задают его: почему вы хотите это сделать?

Ответ №1:

Есть пара переменных, которые вы не указали:

  1. Какую обработку ошибок это должно включать?
  2. Вы хотите, чтобы цикл выполнялся бесконечно?

Предполагая, что соответствующие ответы «Нет» и «Да», вот один из способов сделать это:

 def create_iter(arr):
    i = 0
    while True:
        yield arr[i]
        i = arr[i]

lst = [1,3,-1,2]
my_iterator = create_iter(lst)
  

Это дает:

 >>> for _ in range(10):
>>>    print (next(my_iterator))
1
3
2
-1
2
-1
2
-1
2
-1
  

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

1. Хорошо, но почему не просто for i in create_iter(lst): print(i) ?

2. @zvone Потому что это вызывает бесконечный цикл

3. Ах, это 🙂 Ну, так и должно быть 😉

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

5. @sabbahillel Это верно. OP не указывает, какое поведение он хочет в этом случае, но достаточно легко добавить if i == arr[i]: break и / или try блок, чтобы перехватить IndexError

Ответ №2:

Учитывая, что вы проверяете, что каждое значение находится в списке, за исключением того, что у вас должно быть условие конца списка, тогда у вас будет

 index = 0
while True:
    newindex = mylist[index]
    if newindex >= len(mylist):
        break
    elif newindex == index:
         break
     else:
         index = newindex
  

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