2015-12-23 34 views
5

Desidero trovare l'ultima occorrenza di un elemento 'x' in sequenza 's', o di restituire None se non c'è nessuno e la posizione del primo elemento è uguale a 0trovare l'ultima occorrenza di un elemento in un python elenco

Questo è quello che ho attualmente:

def PositionLast (x,s): 

    count = len(s)+1 
    for i in s: 
     count -= 1 
     if i == x: 
      return count 
    for i in s: 
     if i != x: 
      return None 

quando provo:

>>>PositionLast (5, [2,5,2,3,5]) 
>>> 4 

Questa è la risposta corretta. Tuttavia quando cambio 'x' per 2 invece di 5 ottengo questo:

>>>PositionLast(2, [2,5,2,3,5]) 
>>> 5 

La risposta qui dovrebbe essere 2. Sono confuso su come questo si sta verificando, se qualcuno potrebbe spiegare a cosa ho bisogno per corretto sarei grato. Vorrei anche completare questo con il codice più semplice possibile.

Grazie.

+0

Possibile duplicato di [Trovare il primo e l'ultimo indice di qualche valore in una lista in Python] (http://stackoverflow.com/questions/522372/finding-first-and-last-index-of-some-value- in-a-list-in-python) –

risposta

1
def positionLast(x, L): 
    answer = None 
    for i,e in enumerate(L): 
     if e==x: answer = i 
    return answer 
5

liste peccato è tutto non hanno un metodo rindex, ma è possibile utilizzare index:

last = len(s) - s[::-1].index(x) - 1 

o equivalentemente

for i, v in enumerate(reversed(s)): 
    if v == x: 
     last = len(s) - i - 1 
     break 
3

La logica non è corretta, perché ritorni il conteggio se i==x e si dispone di un ciclo aggiuntivo al termine della funzione.

Invece si ciclo sulle forme d'inversione di enumerare della vostra lista e restituire l'indice della prima occorrenza:

def PositionLast (x,s): 
    return next(i for i,j in list(enumerate(s))[::-1] if j == x) 

Demo:

print PositionLast (2, [2,5,2,3,5,3]) 
2 
print PositionLast (3, [2,5,2,3,5,3]) 
5 
print PositionLast (5, [2,5,2,3,5,3]) 
4 
2

Il codice è sbagliato, è controllare la lista da l'inizio e l'arresto alla prima partita, quello che vuoi è controllare la lista in ordine inverso.

def PositionLast (x,s): 
    count = len(s) 
    for i in s[::-1]: 
     count -= 1 
     if i == x: 
      return count 
    return None 

La prima linea vi dà la risposta corretta solo a causa di una coincidenza:
- Conti uguale 5 durante il controllo per la prima voce.
- Conteggi pari a 4 quando si verifica il secondo elemento, corrisponde, quindi restituisce 4.
- Per coincidenza, questo è l'indice del tuo ultimo elemento.

2

Iterare l'elenco in ordine inverso e quindi controllare x. Questo potrebbe essere un modo efficace come l'elenco di inversione e quindi trovare l'indice dall'inizio è ad uso di risorse.

def PositionLast (x,s): 
    for i in range(len(s)-1,0,-1): 
     if s[i] == x: 
      return i 
    return None 
0
def positionLast(x, L): 
    try: return max(i for i,e in enumerate(L) if e==x) 
    except: return None 
0

Grazie a tutti per le risposte e aiuto! Sfortunatamente nessuno ha avuto la risposta che stavo cercando, ma non importa se l'ho risolto io alla fine, ma la ringrazio molto allo stesso modo!

Ecco il codice finale:

def PositionLast(x,s): 

    count = -1 
    position = None 
    for i in s: 
     count += 1 
     if i == x: 
      position = count 
    return position 

Ciò restituisce le risposte corrette a tutte le mie prove.

Grazie, Eimear.