Soy un novato, pero he estado usando for n, i in enumerate(cars): if n!= 0: do something to i. la lógica es que agrega un 'contador' a cada valor al que luego puede apuntar, por ejemplo, con if n == some_value. en este ejemplo, haría algo en cada instancia de i, excepto en la primera.
user1063287
Respuestas:
268
Las otras respuestas solo funcionan para una secuencia.
Para cualquier iterable, para omitir el primer elemento:
itercars = iter(cars)
next(itercars)for car in itercars:# do work
Si desea omitir el último, puede hacer:
itercars = iter(cars)# add 'next(itercars)' here if you also want to skip the first
prev = next(itercars)for car in itercars:# do work on 'prev' not 'car'# at end of loop:
prev = car
# now you can do whatever you want to do to the last one on 'prev'
Descubrí que hacer cars.pop (0) y cars.pop () funciona bien.
dreamwork801
@ dreamwork801 Mi respuesta y la de Sven, que enlace en el primer comentario, funcionan para cualquier iteración, incluso infinita, ya que no requieren una operación O (n) en los datos antes de que comience la iteración. Su sugerencia, y la de Abhjit, ambas solo funcionan para secuencias, no iterables.
agf
356
Para omitir el primer elemento en Python, simplemente puede escribir
for car in cars[1:]:# Do What Ever you want
o para saltear el último elemento
for car in cars[:-1]:# Do What Ever you want
Puede usar este concepto para cualquier secuencia.
¿Qué tal el uso de la memoria? ¿Slice hace una nueva copia de la subsecuencia?
Voyager
@Voyager Sí, hace una nueva copia.
Srinivas Reddy Thatiparthy
27
La mejor manera de omitir los primeros elementos es:
from itertools import islice
for car in islice(cars,1,None):# do something
islice en este caso se invoca con un punto de inicio de 1 y un punto final de Ninguno, lo que significa el final del iterador.
Para poder omitir elementos desde el final de un iterable, debe conocer su longitud (siempre posible para una lista, pero no necesariamente para todo lo que puede iterar). por ejemplo, islice (cars, 1, len (cars) -1) omitirá el primer y el último elemento de la lista de automóviles.
Eche un vistazo a la respuesta de Sven (poco apreciada). Cubre omitir un número arbitrario de elementos al principio y / o al final de cualquier iterable utilizando islicebastante bien, sin conocer la longitud o almacenar más elementos en la memoria de una vez de lo absolutamente necesario.
agf
La respuesta de Sven en realidad almacenará todo el iterador en la memoria: collections.deque se ejecutará a través del iterador. Intente hacer algo como collections.deque (xrange (10000000)). No hay necesidad de almacenar todas las entradas en la memoria si desea omitir el primer elemento ...
Roee Shenberg
2
An islicees lo que se pasa al dequeiterador, no todo el iterador, y es solo la longitud del número de elementos que se omiten al final. No almacena todo el iterador en la memoria.
agf
26
Aquí hay una función de generador más general que omite cualquier número de elementos desde el principio y el final de un iterable:
def skip(iterable, at_start=0, at_end=0):
it = iter(iterable)for x in itertools.islice(it, at_start):pass
queue = collections.deque(itertools.islice(it, at_end))for x in it:
queue.append(x)yield queue.popleft()
Es posible que desee agregar una ruta rápida para at_end == 0.
agf
collections.deque (...) pasará inmediatamente por el iterador. Esto significa que omitir (xrange (10000000), 1) ocupará mucha memoria aunque realmente no debería.
Roee Shenberg
44
@RoeeShenberg: skip(xrange(10000000), 1)usará at_end=0, por lo que el parámetro to deque()será islice(it, 0), que solo consumirá cero elementos de it. Esto no ocupará mucha memoria.
Sven Marnach
8
for item in do_not_use_list_as_a_name[1:-1]:#...do whatever
Bueno, para empezar, tu sintaxis no es realmente Python.
Las iteraciones en Python están sobre el contenido de los contenedores (bueno, técnicamente está sobre iteradores), con una sintaxis for item in container. En este caso, el contenedor es la carslista, pero desea omitir el primer y el último elemento, por lo que eso significa cars[1:-1](las listas de Python son de base cero, los números negativos cuentan desde el final y :está cortando la sintaxis.
Lo hago así, aunque parece un truco, funciona siempre:
ls_of_things =['apple','car','truck','bike','banana']
first =0
last = len(ls_of_things)for items in ls_of_things:if first ==0
first = first +1passelif first == last -1:breakelse:
do_stuff
first = first +1pass
for n, i in enumerate(cars): if n!= 0: do something to i
. la lógica es que agrega un 'contador' a cada valor al que luego puede apuntar, por ejemplo, conif n == some_value
. en este ejemplo, haría algo en cada instancia de i, excepto en la primera.Respuestas:
Las otras respuestas solo funcionan para una secuencia.
Para cualquier iterable, para omitir el primer elemento:
Si desea omitir el último, puede hacer:
fuente
Para omitir el primer elemento en Python, simplemente puede escribir
o para saltear el último elemento
Puede usar este concepto para cualquier secuencia.
fuente
La mejor manera de omitir los primeros elementos es:
islice en este caso se invoca con un punto de inicio de 1 y un punto final de Ninguno, lo que significa el final del iterador.
Para poder omitir elementos desde el final de un iterable, debe conocer su longitud (siempre posible para una lista, pero no necesariamente para todo lo que puede iterar). por ejemplo, islice (cars, 1, len (cars) -1) omitirá el primer y el último elemento de la lista de automóviles.
fuente
islice
bastante bien, sin conocer la longitud o almacenar más elementos en la memoria de una vez de lo absolutamente necesario.islice
es lo que se pasa aldeque
iterador, no todo el iterador, y es solo la longitud del número de elementos que se omiten al final. No almacena todo el iterador en la memoria.Aquí hay una función de generador más general que omite cualquier número de elementos desde el principio y el final de un iterable:
Ejemplo de uso:
fuente
at_end == 0
.skip(xrange(10000000), 1)
usaráat_end=0
, por lo que el parámetro todeque()
seráislice(it, 0)
, que solo consumirá cero elementos deit
. Esto no ocupará mucha memoria.fuente
list
como nombre de variablelist
se puede volver a vincular. Es por eso que no deberías , en lugar de no poder , usarlo.Basado en la respuesta de @SvenMarnach, pero un poco más simple y sin usar deque
También
timeit
tenga en cuenta que, según mi resultado, esto es marginalmente más rápido que la solución de dequefuente
tee()
, todavía está creando una lista completa en la memoria para el generador, ¿verdad? (suit1
)Ejemplo:
En Python index start from 0, podemos utilizar el operador de corte para realizar manipulaciones en iteración.
fuente
Bueno, para empezar, tu sintaxis no es realmente Python.
Las iteraciones en Python están sobre el contenido de los contenedores (bueno, técnicamente está sobre iteradores), con una sintaxis
for item in container
. En este caso, el contenedor es lacars
lista, pero desea omitir el primer y el último elemento, por lo que eso significacars[1:-1]
(las listas de Python son de base cero, los números negativos cuentan desde el final y:
está cortando la sintaxis.Entonces quieres
fuente
Un método alternativo:
fuente
Aquí está mi opción preferida. No requiere agregar mucho al ciclo, y no usa nada más que herramientas integradas.
Ir desde:
a:
fuente
Si
cars
es una secuencia que puedes hacerfuente
El
more_itertools
proyecto se extiendeitertools.islice
para manejar índices negativos.Ejemplo
Por lo tanto, puede aplicarlo con elegancia elementos de corte entre el primer y el último elemento de un iterable:
fuente
Lo hago así, aunque parece un truco, funciona siempre:
fuente