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?

Vincent Catalano
fuente
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.

Björn Pollex
fuente
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):
    ...
John La Rooy
fuente
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.

Lakshman Prasad
fuente
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'])
sintetizador
fuente
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
juanchopanza
fuente
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']
>>>
John Machin
fuente
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])
Charlie Su
fuente
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 )
perezoso
fuente