2010-08-03 11 views
9

Suponiendo que tengo una lista object_list que contiene objetos.Python verifique el primer y último índice de una lista

Quiero comprobar si mi iteración actual es la primera o la última.

for object in object_list: 
    do_something 
    if first_indexed_element: 
     do_something_else 
    if last_indexed_element: 
     do_another_thing 

¿Cómo se puede lograr esto? Sé que puedo usar el rango y el índice de recuento, pero si me siento torpe.

Saludos

Respuesta

12
li = iter(object_list) 

obj = next(li) 

do_first_thing_with(obj) 

while True: 
    try: 
     do_something_with(obj) 
     obj = next(li) 
    except StopIteration: 
     do_final_thing_with(obj) 
     break 
+1

+1 para usar iteradores en lugar de números de índice. En la pregunta del OP, todos los objetos se procesan con do_something, y el procesamiento especial se realiza con el primero y el último. En su código, realiza el procesamiento especial para el primer elemento, pero no el procesamiento de cada elemento. Creo que solo necesita invertir las 2 instrucciones en su cláusula try: para obtener el comportamiento deseado. – PaulMcG

+1

Bastante complicado. No es exactamente lo que el autor quiere (debe llamarse a 'do_first_thing_with' después del primer' do_something_with'). –

+0

probablemente la solución más eficiente (+1), pero desafortunadamente no muy conciso/fácil de asimilar. – wds

14

Puede utilizar enumerate():

for i, obj in enumerate(object_list): 
    do_something 
    if i == 0: 
     do_something_else 
    if i == len(object_list) - 1: 
     do_another_thing 

Pero en vez de comprobar en cada iteración qué objeto se trata, tal vez algo como esto es mejor:

def do_with_list(object_list): 
    for obj in object_list: 
     do_something(obj) 
    do_something_else(object_list[0]) 
    do_another_thing(object_list[-1]) 

Imagínese tiene una lista de 100 objetos, luego hace 198 comparaciones innecesarias, porque el elemento actual no puede ser el primer o el último elemento en la lista.

Pero depende de si las declaraciones tienen que ejecutarse en un cierto orden y qué están haciendo.


Btw. no object sombra, que ya es un identificador en Python;)

+1

'I' nunca será igual 'len (object_list)'. – Amber

+0

@Amber: cierto, gracias –

3
for index, obj in enumerate(object_list): 
    do_something 
    if index == 0: 
     do_something_else 
    if index == len(object_list)-1: 
     do_another_thing 
+0

Se romperá si object_list es iterador. Es mejor escribir un código que funcione con todos los iterables, no solo con las listas. –

+0

No cuando hace que el código sea mucho más complejo de leer, y usted sabe que trabajará con listas. – Amber

0

Sólo tiene que utilizar un contador, sin necesidad de rango:

Digamos que su contador es cpt.

if cpt == 0: 
    print "first" 

if cpt == len(object_list) - 1: 
    print "last" 

edición: la solución de enumeración puede ser más elegante.

0
  1. Puede hacer i = 0 y luego i ++ en iteraciones. Entonces si i == 0 es la primera iteración, si i == list.size() - 1 de lo que es la última iteración.
  2. Debe haber algo como indexOf (objeto), que devuelve la posición del elemento en la lista. si 0 - que la primera iteración, si el tamaño() - 1 que el último. Pero es caro.
  3. use enumerate. Ver mensajes de Amber o Felix.
  4. compare el elemento actual con la lista [0] y con la lista [-1]. en primer caso - primera iteración, en el último caso - última iteración. También es caro

Así que me quedaría con 1 ó 3.
PS: list.size() se len (lista), por supuesto.

+0

¿Por qué 4. sería caro? El acceso a la lista debe ser 'O (1)'. –

+0

No sé qué es O (1), pero la comparación de objetos personalizados, imho, siempre es más lenta que la comparación de números (incluso si también son objetos). Además, en este caso debe proporcionar reglas de igualdad, que pueden ser bastante complicadas. Además, la lista puede contener duplicados, por lo que puede causar errores (es un punto de vista diferente, sin embargo, debe considerarlo). – foret

+0

¡Además! : cuando intentas obtener un elemento de la lista, Python primero encuentra la lista, luego encuentra el elemento en el índice. si usa el número, solo debe encontrar el número, por lo tanto, 1 operación menos. Yo no sé nada de las partes internas de Python. – foret

1
first = True 
for o in object_list: 
    do_something(o) 
    if first: 
     first = False 
     do_something_with_first(o) 
if 'o' in locals(): 
    do_something_with_last(o) 
Cuestiones relacionadas