Iniciar índice para iterar la lista de Python


88

¿Cuál es la mejor manera de establecer un índice de inicio al iterar una lista en Python? Por ejemplo, tengo una lista de los días de la semana (domingo, lunes, martes, ... sábado), pero quiero recorrer la lista a partir del lunes. ¿Cuál es la mejor práctica para hacer esto?


1
¿Solo desea hacer un bucle hasta el sábado o desea que se envuelva e imprima el domingo pasado?
juanchopanza

Solo quería hacer un bucle hasta el sábado. No me había dado cuenta hasta ahora de que puedes usar la división en listas de Python.
Vincent Catalano

¿Existe una solución que también se ocupa de los generadores / iterables y no solo de las listas? ¿O listas realmente grandes?
Charlie Parker

Respuestas:


174

Puedes usar rebanar :

for item in some_list[2:]:
    # do stuff

Esto comenzará en el tercer elemento y se repetirá hasta el final.


2
Esto es exactamente lo que estaba buscando. ¡Gracias!
Vincent Catalano

30
¿No es esto ineficaz para listas grandes? Creo que esta operación de corte tiene que copiar los elementos de la lista a los que se hace referencia en una nueva lista.
UndeadKernel

4
Sí, esto es ineficaz para listas grandes. Consulte la respuesta de gnibblers a continuación para obtener una solución que no se copia.
Björn Pollex

Sin embargo, ¿cómo haces esto si estás haciendo un bucle utilizando generadores / iterables?
Charlie Parker

2
Debe usar islice, como se sugiere en la respuesta de John La Rooy.
Björn Pollex

50

islice tiene la ventaja de que no necesita copiar parte de la lista

from itertools import islice
for day in islice(days, 1, None):
    ...

13

Siempre puede realizar un bucle con un contador de índice del bucle de estilo C convencional:

for i in range(len(l)-1):
    print l[i+1]

Siempre es mejor seguir el estilo de "bucle en cada elemento" porque eso es lo normal, pero si se interpone en su camino, recuerde que el estilo convencional también es compatible, siempre.


9

stdlib te conectará hijo!

deque.rotate():

#!/usr/local/bin/python2.7

from collections import deque

a = deque('Monday Tuesday Wednesday Thursday Friday Saturday Sunday'.split(' '))
a.rotate(3)
deque(['Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday'])

4

Si todo lo que desea es imprimir a Mondaypartir de ahora, puede usar listel indexmétodo de para encontrar la posición en la que está "Lunes" en la lista e iterar desde allí como se explica en otras publicaciones. El uso le list.indexahorra codificar el índice para "Lunes", que es una fuente potencial de error:

days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
for d in days[days.index('Monday'):] :
   print d

muy buena solución!
aderchox

3

Aquí hay un generador de rotación que no necesita hacer una copia deformada de la secuencia de entrada ... puede ser útil si la secuencia de entrada es mucho mayor que 7 elementos.

>>> def rotated_sequence(seq, start_index):
...     n = len(seq)
...     for i in xrange(n):
...         yield seq[(i + start_index) % n]
...
>>> s = 'su m tu w th f sa'.split()
>>> list(rotated_sequence(s, s.index('m')))
['m', 'tu', 'w', 'th', 'f', 'sa', 'su']
>>>

Sí, y sería fácil de ampliar para generar una secuencia recurrente infinita.
perezoso

No puedo evitar agradecer a @JohnMachin: gran trabajo para alguien muerto estos 264 años
jjon

1

¿Por qué la gente usa la división de listas (lento porque se copia en una nueva lista), importa una función de biblioteca o intenta rotar una matriz para esto?

Utilice un bucle for normal con range(start, stop, step)(donde starty stepson argumentos opcionales).

Por ejemplo, recorriendo una matriz que comienza en el índice 1:

for i in range(1, len(arr)):
    print(arr[i])

0

Si desea "ajustar" y rotar efectivamente la lista para comenzar con el lunes (en lugar de simplemente cortar los elementos antes del lunes):

dayNames = [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 
            'Friday', 'Saturday',  ]

startDayName = 'Monday'

startIndex = dayNames.index( startDayName )
print ( startIndex )

rotatedDayNames = dayNames[ startIndex: ] + dayNames [ :startIndex ]

for x in rotatedDayNames:
    print ( x )
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.