Digamos que tenemos una lista de números del 0 al 1000. ¿Existe una manera pitónica / eficiente de producir una lista del primer y cada 10º elemento, es decir [0, 10, 20, 30, ... ]
?
Sí, puedo hacer esto usando un bucle for, pero me pregunto si hay una forma más ordenada de hacerlo, ¿tal vez incluso en una línea?
0
es redundante enl[0::10]
.l[::10]
Es más legible, menos confuso.source_list[::10]
es lo más obvio, pero esto no funciona para ningún iterable y no es eficiente en memoria para listas grandes.itertools.islice(source_sequence, 0, None, 10)
funciona para cualquier iterable y es eficiente en memoria, pero probablemente no sea la solución más rápida para una lista grande y un gran paso.(source_list[i] for i in xrange(0, len(source_list), 10))
fuente
Puede usar el operador de división de esta manera:
fuente
L[2::2]
Del manual:
s[i:j:k] slice of s from i to j with step k
fuente
Esto selecciona cada décimo elemento de la lista.
fuente
¿Por qué no usar también un parámetro de paso de la función de rango para obtener:
A modo de comparación, en mi máquina:
fuente
fuente
Aquí hay una mejor implementación de una comprensión de la lista "cada 10 elementos", que no utiliza el contenido de la lista como parte de la prueba de membresía:
Pero esto sigue siendo mucho más lento que simplemente usar el corte de listas.
fuente
Las comprensiones de listas están hechas exactamente para eso:
Puede obtener más información sobre ellos en la documentación oficial de Python: http://docs.python.org/tutorial/datastructures.html#list-comprehensions
fuente