2011-05-27 7 views
39

¿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 repetir la lista a partir del lunes. ¿Cuál es la mejor práctica para hacer esto?Índice de inicio para iterar la lista de Python

+1

hacer lo que desea para recorrer hasta el sábado, o quieres que se ajuste alrededor de impresión y el domingo pasado? – juanchopanza

+0

Solo quería seguir hasta el sábado. Hasta ahora no me había dado cuenta de que puedes usar el corte en listas de Python. –

+0

¿Existe alguna solución que también trate con generadores/iterables y no solo con listas? ¿O listas realmente grandes? –

Respuesta

82

Puede utilizar slicing:

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

Esto iniciará en el tercer elemento y repetir hasta el final.

+1

Esto es exactamente lo que estaba buscando. ¡Gracias! –

+4

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

+1

Sí, esto es ineficaz para listas grandes. Ver gnibblers respuesta a continuación para una solución que no copia. –

7

Puede siempre bucle que utiliza un índice contrarrestar el bucle estilo convencional C:

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

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

16

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

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

Si lo que desea es imprimir desde Monday en adelante, puede utilizar list 's index método para encontrar la posición donde "Lunes" está en la lista, e iterar desde allí como se explica en otras publicaciones. Usando list.index le ahorra la codificación dura 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 
0

Si desea "envolvente" y efectivamente gire la lista para comenzar con el lunes (en lugar de sólo cortar los artículos 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) 
3

Aquí es 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 artículos .

>>> 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'] 
>>> 
+0

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

+0

no puede dejar de agradecer @JohnMachin: gran trabajo para alguien muerto estos 264 años – jjon

5

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']) 
Cuestiones relacionadas