2010-12-15 16 views
6

Por lo tanto, veo que al llamar al array[:-1] voy a clonar la matriz.Loop de Python a [: -1]

Supongo que tengo una gran matriz con como 3000 elementos en ella. ¡No quiero que se clone mientras lo repito! Solo quiero iterar a la 2da última.

for item in array[ :-1 ] : 
    # do something with the item 

Así que tengo que recurrir a una variable de contador,

for c in range(0, len(array) - 1) : 
    # do something with array[ c ] 

o hay manera de hacer/se array[:-1] sintaxis de ser eficiente?

+1

posible duplicado de [¿Puedo crear una "vista" en una lista de Python?] (http://stackoverflow.com/questions/3485475/can-i-create-a-view-on-a-python-list) –

+2

Lamentablemente, la "otra pregunta" se pierde en 'itertools' por completo. Por lo tanto, estoy * no * votando para cerrar esta pregunta. –

+0

@pst ¿No sería "lo correcto hacer" publicar una mejor respuesta en la otra pregunta? –

Respuesta

6
for item in itertools.islice(array, len(array) - 1): 
4

Salida itertools.islice:

from itertools import islice 
for item in islice(array, 0, len(array) - 1): 
    # do something with item 

Esto se trata de la mitad de lo que quieres; elimina la necesidad de decir array[i], pero no la necesidad de especificar len(array) - 1.

Por lo que vale, 3000 elementos no son nada para una computadora moderna, no me preocuparía la ineficiencia a menos que su programa sea notablemente lento y lo haya perfilado para determinar que este código es un factor contribuyente.

2

Para cuando usted no quiere/no puede/no sabe la longitud de la secuencia:

def allbutlast(seq): 
    it = iter(seq) 
    el = next(it) 
    for e in it: 
    yield el 
    el = e 

for i in allbutlast([1, 2, 3]): 
    print i