2015-12-23 27 views
5

Chcę odnaleźć ostatnie wystąpienie elementu "x" w sekwencji 's' lub zwrócić None, jeśli nie ma i pozycja pierwszego elementu jest równa 0znajdowanie ostatniego wystąpienia pozycji na liście python

to co obecnie mam:

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 

Kiedy próbuję:

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

to jest prawidłowa odpowiedź. Jednak przy zmianie „X” do 2 zamiast 5 otrzymuję to:

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

Odpowiedź tutaj powinno być 2. Jestem zdezorientowany, jak to ma miejsce, jeśli ktoś mógłby wyjaśnić, co muszę poprawne, będę wdzięczny. Chciałbym również uzupełnić to o najbardziej podstawowy kod możliwy.

Dziękuję.

+0

Możliwy duplikat [Znajdowanie pierwszego i ostatniego indeksu pewnej wartości na liście w Pythonie] (http://stackoverflow.com/questions/522372/finding- first-and-last-index-of-some-value- in-a-list-in-python) –

Odpowiedz

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

wykazy To szkoda nie mieć metodę rindex, ale można użyć index:

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

lub równoważnie

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

Twoja logika jest błędna, ponieważ powrót licznika jeśli i==x i masz dodatkową pętlę na końcu swojej funkcji.

Zamiast tego pętli nad odwracalnych form enumerate swojej listy i zwraca indeks pierwszego wystąpienia:

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

Twój kod jest niewłaściwy, to sprawdzenie listy od Na początku i przy pierwszym meczu, chcesz sprawdzić listę w odwrotnej kolejności.

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

Twoja pierwsza linia daje poprawną odpowiedź tylko ze względu na zbieg okoliczności:
- Counts równe 5, podczas sprawdzania pierwszego elementu.
- Liczba równa 4 podczas sprawdzania drugiego elementu, pasuje, a następnie zwraca 4.
- Przypadkowo jest to indeks ostatniego przedmiotu.

2

Powtórz listę w odwrotnej kolejności, a następnie zaznacz x. Może to być skuteczny sposób na odwrócenie listy, a następnie znalezienie indeksu od początku wymaga dużej ilości zasobów.

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

Dzięki wszystkim za odpowiedzi i pomoc! Niestety, nikt nie znał odpowiedzi, której szukałem, ale bez względu na to, w końcu sam ją wypracowałem, ale bardzo ci dziękuję!

Oto ostateczny kod:

def PositionLast(x,s): 

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

to przywrócenie prawidłowych odpowiedzi na wszystkie moje testów.

Dzięki, Eimear.