¿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?
88
Respuestas:
Puedes usar rebanar :
for item in some_list[2:]: # do stuff
Esto comenzará en el tercer elemento y se repetirá hasta el final.
fuente
islice
, como se sugiere en la respuesta de John La Rooy.islice
tiene la ventaja de que no necesita copiar parte de la listafrom itertools import islice for day in islice(days, 1, None): ...
fuente
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.
fuente
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'])
fuente
Si todo lo que desea es imprimir a
Monday
partir de ahora, puede usarlist
elindex
mé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 lelist.index
ahorra 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
fuente
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'] >>>
fuente
¿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)
(dondestart
ystep
son argumentos opcionales).Por ejemplo, recorriendo una matriz que comienza en el índice 1:
for i in range(1, len(arr)): print(arr[i])
fuente
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 )
fuente