#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:
Есть пара переменных, которые вы не указали:
- Какую обработку ошибок это должно включать?
- Вы хотите, чтобы цикл выполнялся бесконечно?
Предполагая, что соответствующие ответы «Нет» и «Да», вот один из способов сделать это:
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
Обратите внимание, что если каждая запись в списке является допустимым индексом, то вы получите бесконечный цикл.