python - index - Ciclo a través de la lista a partir de un elemento determinado
python for loop index (6)
Hm, http://docs.python.org/library/itertools.html#itertools.cycle no tiene ese elemento de inicio.
Tal vez simplemente comienzas el ciclo de todos modos y eliminas los primeros elementos que no te gustan.
Digamos que tengo una lista:
l = [1, 2, 3, 4]
Y quiero recorrerlo a través de él. Normalmente, haría algo como esto,
1, 2, 3, 4, 1, 2, 3, 4, 1, 2...
Quiero poder comenzar en un cierto punto del ciclo, no necesariamente un índice, pero tal vez coincidir con un elemento. Digamos que quería comenzar en cualquier elemento de la lista ==4
, entonces la salida sería,
4, 1, 2, 3, 4, 1, 2, 3, 4, 1...
¿Cómo puedo lograr esto?
Mira el módulo itertools . Proporciona toda la funcionalidad necesaria.
from itertools import cycle, islice, dropwhile
L = [1, 2, 3, 4]
cycled = cycle(L) # cycle thorugh the list ''L''
skipped = dropwhile(lambda x: x != 4, cycled) # drop the values until x==4
sliced = islice(skipped, None, 10) # take the first 10 values
result = list(sliced) # create a list from iterator
print(result)
Salida:
[4, 1, 2, 3, 4, 1, 2, 3, 4, 1]
No soy un gran fanático de importar módulos cuando puedes hacer las cosas por tu cuenta en un par de líneas. Aquí está mi solución sin importaciones:
def cycle(my_list, start_at=None):
start_at = 0 if start_at is None else my_list.index(start_at)
while True:
yield my_list[start_at]
start_at = (start_at + 1) % len(my_list)
Esto devolverá un iterador (infinito) en bucle a su lista. Para obtener el siguiente elemento del ciclo, debe usar la next
declaración:
>>> it1 = cycle([101,102,103,104])
>>> next(it1), next(it1), next(it1), next(it1), next(it1)
(101, 102, 103, 104, 101) # and so on ...
>>> it1 = cycle([101,102,103,104], start_at=103)
>>> next(it1), next(it1), next(it1), next(it1), next(it1)
(103, 104, 101, 102, 103) # and so on ...
Otra opción extraña es que recorrer las listas puede realizarse hacia atrás . Por ejemplo:
# Run this once
myList = [''foo'', ''bar'', ''baz'', ''boom'']
myItem = ''baz''
# Run this repeatedly to cycle through the list
if myItem in myList:
myItem = myList[myList.index(myItem)-1]
print myItem
Utilice el operador aritmético mod
. Supongamos que está comenzando desde la posición k
, entonces k
debería actualizarse así:
k = (k + 1) % len(l)
Si desea comenzar desde un determinado elemento, no un índice, siempre puede buscarlo como k = l.index(x)
donde x es el elemento deseado.
import itertools as it
l = [1, 2, 3, 4]
list(it.islice(it.dropwhile(lambda x: x != 4, it.cycle(l)), 10))
# returns: [4, 1, 2, 3, 4, 1, 2, 3, 4, 1]
así que el iterador que quieres es:
it.dropwhile(lambda x: x != 4, it.cycle(l))