Equivelant to rindex для списков в Python
Есть ли эффективный способ найти последний соответствующий элемент в списке? При работе со строками вы можете найти последний элемент с rindex:
>>> a="GEORGE"
>>> a.rindex("G")
4
... Но этот метод не существует для списков:
>>> a=[ "hello", "hello", "Hi." ]
>>> a.rindex("hello")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'rindex'
Есть ли способ получить это без создания большого цикла? Я бы предпочел не использовать обратный метод, если его можно избежать, так как порядок важен, и мне также нужно было бы сделать немного дополнительной математики, чтобы выяснить, где был / будет / был объект. Это кажется расточительным.
Редактировать:
Чтобы уточнить, мне нужен номер индекса этого элемента.
4 ответа
Как насчет:
len(a) - a[-1::-1].index("hello") - 1
Изменить (ввести в действие, как предложено):
def listRightIndex(alist, value):
return len(alist) - alist[-1::-1].index(value) -1
Это должно работать:
for index, item in enumerate(reversed(a)):
if item == "hello":
print len(a) - index - 1
break
Я написал простую функцию Python, и вот она:
def list_rindex(lst, item):
"""
Find first place item occurs in list, but starting at end of list.
Return index of item in list, or -1 if item not found in the list.
"""
i_max = len(lst)
i_limit = -i_max
i = -1
while i > i_limit:
if lst[i] == item:
return i_max + i
i -= 1
return -1
Но пока я тестировал его, EwyynTomato опубликовал лучший ответ. Используйте механизм "нарезки", чтобы перевернуть список и использовать .index()
метод.
Опоры start
:
def rindex(lst, val, start=None):
if start is None:
start = len(lst)-1
for i in xrange(start,-1,-1):
if lst[i] == val:
return i