поиск последнего вхождения элемента в список python

Я хочу найти последнее вхождение элемента 'x' в последовательности 's' или вернуть None, если его нет, а позиция первого элемента равна 0

Это то, что я сейчас имею:

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 

Когда я пытаюсь:

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

Это правильный ответ. Однако, когда я меняю 'x' на 2 вместо 5, я получаю следующее:

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

Ответ здесь должен быть 2. Я смущен относительно того, как это происходит, если кто-нибудь может объяснить, что мне нужно исправить, я был бы благодарен. Я также хотел бы завершить это с помощью самого базового кода.

Спасибо.

    В списках жалости нет метода rindex , но вы можете использовать index :

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

    или эквивалентно

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

    Ваша логика неверна, потому что вы возвращаете счетчик, если i==x и у вас есть дополнительный цикл при завершении вашей функции.

    Вместо этого вы перебираете обратные формы перечисления своего списка и возвращаете индекс первого вхождения:

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

    Демо-версия:

     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 

    Ваш код неверен, он проверяет список с самого начала и останавливается в первом матче, и вы хотите проверить список в обратном порядке.

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

    Ваша первая строка дает правильный ответ только из-за совпадения:
    – Считается равным 5 при проверке первого элемента.
    – Считает равным 4 при проверке второго элемента, он соответствует, а затем возвращает 4.
    – По совпадению, это индекс вашего последнего предмета.

    Перечислите список в обратном порядке, а затем проверьте x. Это может быть эффективным способом, поскольку реверсивный список, а затем поиск индекса с начала является ресурсоемким.

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

    Спасибо всем за ответы и помощь! К сожалению, ни у кого не было ответа, которого я искал, но независимо от того, я сам это сделал сам, но спасибо вам все же!

    Вот окончательный код:

     def PositionLast(x,s): count = -1 position = None for i in s: count += 1 if i == x: position = count return position 

    Это возвращает правильные ответы на все мои тесты.

    Спасибо, Эймер.