2010-08-03 14 views
9

Supponendo che io abbia lista lista_oggetti che contiene oggetti.Python controlla il primo e l'ultimo indice di una lista

Voglio verificare se la mia attuale iterazione è al primo o all'ultimo.

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

Come può essere ottenuto? So che posso usare range e count index ma se mi sembra goffo.

saluti

risposta

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 per l'utilizzo di iteratori anziché numeri di indice. Nella domanda dell'OP, tutti gli oggetti vengono elaborati con do_qualcosa e l'elaborazione speciale viene eseguita con il primo e l'ultimo. Nel tuo codice, esegui l'elaborazione speciale per il primo elemento, ma non l'elaborazione di ogni articolo. Penso che devi solo invertire le 2 affermazioni nel tuo tentativo: clausola per ottenere il comportamento desiderato. – PaulMcG

+1

Abbastanza complicato. Non esattamente quello che l'autore vuole ("do_first_thing_with" dovrebbe essere chiamato dopo "do_something_with'). –

+0

probabilmente la soluzione più efficiente (+1), ma sfortunatamente non molto concisa/facile da trovare. – wds

14

È possibile utilizzare 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 

Ma invece di controllare in ogni iterazione che obiettare che si tratta di, forse qualcosa di simile a questo è meglio:

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]) 

Imagine hai una lista di 100 oggetti, poi fai 198 confronti non necessari, perché l'elemento corrente non può essere il primo o l'ultimo elemento della lista.

Ma dipende se le istruzioni devono essere eseguite in un determinato ordine e cosa stanno facendo.


Btw. Non ombra object, è già un identificatore in Python;)

+1

'I' non sarà mai uguale' len (Object_List) '. – Amber

+0

@Amber: true, grazie –

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

interromperà se object_list è iteratore. È meglio scrivere codice che funzioni con tutti gli iterabili, non solo con le liste. –

+0

Non quando rende il codice molto più complesso da leggere e sai che lavorerai con le liste. – Amber

0

Devi solo usare un contatore, senza bisogno di gamma:

Diciamo che il vostro contatore è cpt.

if cpt == 0: 
    print "first" 

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

modificare: la soluzione enumerate può essere più elegante.

0
  1. È possibile eseguire i = 0 e quindi i ++ in iterazioni. Quindi se io == 0 è la prima iterazione, se io == list.size() - 1 di quanto non sia l'ultima iterazione.
  2. Ci deve essere smth come indexOf (oggetto), che restituisce la posizione dell'elemento nella lista. se 0 - rispetto alla prima iterazione, se size() - 1 che last. Ma è costoso.
  3. utilizzare enumerare. Vedi i post di Amber o Felix.
  4. confronta l'elemento corrente nell'elenco [0] e all'elenco [-1]. nel primo caso - prima iterazione, in ultimo caso - ultima ripetizione. È anche costoso.

Così mi piacerebbe scegliere 1 o 3.
PS: list.size() viene len (lista) naturalmente.

+0

Perché dovrebbe essere costoso? L'accesso alla lista dovrebbe essere 'O (1)'. –

+0

Non so cosa sia O (1), ma confrontare gli oggetti personalizzati, imho, è sempre più lento confrontando i numeri (anche se sono oggetti). Inoltre, in questo caso dovresti fornire regole di uguaglianza, che possono essere piuttosto complicate. Inoltre, la lista può contenere duplicati, quindi può causare errori (è un diverso punto di vista, tuttavia è necessario considerarlo). – foret

+0

Inoltre! : quando si tenta di ottenere un elemento dalla lista, python prima trova l'elenco, quindi trova l'elemento all'indice. se usi il numero, deve trovare solo il numero, quindi 1 operazione in meno. imho - non conosco gli interni di 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) 
Problemi correlati