Pregunta La mayoría de Pythonic para / enumerar bucle?


Tengo una condición de bucle:

for count, item in enumerate(contents):

pero solo quiere usar los primeros 10 elementos de contenido. ¿Cuál es la forma más pitónica de hacerlo?

Haciendo un:

if count == 10: break

parece algo antiponético. ¿Hay una mejor manera?


5
2018-01-06 14:04


origen


Respuestas:


Usa una rebanada (notación de rebanada)

for count, item in enumerate(contents[:10]):

Si está iterando sobre un generador, o si los elementos en su lista son grandes y no desea la sobrecarga de crear una nueva lista (como lo hace cortar) puede usar islice desde el itertools módulo:

for count, item in enumerate(itertools.islice(contents, 10)):

De cualquier manera, sugiero que hagas esto de una manera robusta, lo que significa envolviendo la funcionalidad dentro de una función (como se quiere hacer con esa funcionalidad, de hecho, es la razón de la función de nombre)

import itertools

def enum_iter_slice(collection, slice):
    return enumerate(itertools.islice(collection, slice))

Ejemplo:

>>> enum_iter_slice(xrange(100), 10)
<enumerate object at 0x00000000025595A0>
>>> list(enum_iter_slice(xrange(100), 10))
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)]
>>> for idx, item in enum_iter_slice(xrange(100), 10):
    print idx, item

0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9

Si estabas usando enumerar y tu count variable solo para verificar el índice de ítems (para que al usar su método pueda salir / romper el ciclo en el décimo ítem.) No necesita enumerar, y solo use el itertools.islice() todo en su propio como su función.

for item in itertools.islice(contents, 10):

11
2018-01-06 14:04



Si la lista es grande o contents es un generador, uso itertools.islice():

from itertools import islice

for count, item in enumerate(islice(contents, 10)):

Para listas o tuplas más pequeñas, solo use slicing:

for count, item in enumerate(contents[:10]):

El corte crea una nueva lista o un objeto de tupla, que para 10 elementos no es tan importante.


5
2018-01-06 14:05



Solo una adición a las dos respuestas ya dadas:

Propongo a pensar sobre la situación en la que se encuentra. Por qué ¿Es que quieres hacer 10 iteraciones y no más? ¿Es más el deseo de abortar después de diez ciclos (por ejemplo, porque cada ciclo lleva mucho tiempo y todo el tiempo de ejecución estará limitado mientras se abandona la integridad) o es la razón detrás de su requerimiento de que los primeros diez elementos sean un grupo especial de elementos? (tal vez los diez para mostrar)?

En el primer caso diría que la forma más correcta sería la if ... break Lo propusiste porque representa tus pensamientos más directos.

En este último caso propondría nombrar al niño, i. mi. introduzca un nombre de habla para ese grupo especial de los primeros diez elementos (por ejemplo, g. elements_to_display) e iterar sobre ellos.


0
2018-01-06 14:23