2012-06-20 8 views
6

¿Existe una solución pitonica para eliminar los valores n de un iterador? Usted puede hacer esto simplemente descartando n los valores de la siguiente manera:Solución Pythonic para soltar valores N de un iterador

def _drop(it, n): 
    for _ in xrange(n): 
     it.next() 

pero esto no es tan elegante como la OMI código Python debe ser. ¿Hay un mejor enfoque que me falta aquí?

+2

Usar 'next (it)' es mejor. – jamylak

+1

@jamylak No con Python <2.6;) – schlamar

Respuesta

8

creo que busca la receta "consumir"

http://docs.python.org/library/itertools.html#recipes

def consume(iterator, n): 
    "Advance the iterator n-steps ahead. If n is none, consume entirely." 
    # Use functions that consume iterators at C speed. 
    if n is None: 
     # feed the entire iterator into a zero-length deque 
     collections.deque(iterator, maxlen=0) 
    else: 
     # advance to the empty slice starting at position n 
     next(islice(iterator, n, n), None) 

Si no necesita el comportamiento especial cuando n es None, sólo puede utilizar

next(islice(iterator, n, n), None) 
+0

'# Use funciones que consuman iteradores a la velocidad C.? ¿Qué significa esto? –

+0

@Burhan: Se implementan varias funciones/tipos en CPython en código C en lugar de Python. Esos son generalmente más rápidos que los equivalentes de Python. –

+0

@BurhanKhalid Se escribieron en código C para que funcionen a la velocidad más rápida posible. El código de Python suele ser más lento. – jamylak

3

Puede crear un segmento iterativo que comienza en el elemento n:

import itertools 
def drop(it, n): 
    return itertools.islice(it, n, None) 
+1

Aunque es inteligente, esto en realidad no deja caer nada hasta/* a menos que * la secuencia se repita. –

+0

Es cierto, depende de lo que necesita. Cuando en realidad se deja caer puede que no le importe. – ThiefMaster

0

Usted podría hacer esto con el uso elegante de itertools.dropwhile, pero yo dudaría en llamarlo de alguna manera elegante:

def makepred(n): 
    def pred(x): 
     pred.count += 1 
     return pred.count < n 
    pred.count = 0 
    return pred 

itertools.dropwhile(it, makepred(5)) 

Realmente no recomiendo esto, sin embargo - depender de los efectos secundarios de una función predicativa están muy del lado extraño.

Cuestiones relacionadas