Как найти последнее вхождение элемента в список Python
Насколько мне показала справка, нет встроенной функции, которая возвращает последнее вхождение строки (например, в обратном порядке index ). В общем, как я могу найти последнее вхождение «a» в данном списке?
14 ответов
Если вы на самом деле используете только отдельные буквы, как показано в вашем примере, то << X0>> будет хорошо работать. Это вызывает ValueError , если такого элемента нет, тот же класс ошибок, что и list.index , будет вызван. Демо-версия :
В более общем случае вы можете использовать list.index в обратном списке:
Разрезание здесь создает копию всего списка. Это хорошо для коротких списков, но для случая, когда li очень большой, эффективность может быть лучше с ленивым подходом:
Многие другие решения требуют итерации по всему списку. Это не так.
Изменить: задним числом это кажется ненужным волшебством. Я бы сделал что-то вроде этого:
Если вам нужно найти последнее вхождение 2
last_occurence = (len(val) -1) — list(reversed(val)).index(2)
Это вызовет исключение StopIteration , если элемент не найден; Вы можете поймать это и вызвать ValueError вместо этого, чтобы заставить себя вести себя совсем как index .
Определяется как функция, избегая ярлыка lambda :
Это работает и для не чаров. Проверено :
Однострочный, как у Игнасио, за исключением того, что он немного проще / понятнее
Мне это кажется очень ясным и Pythonic: вы ищете самый высокий индекс, который содержит соответствующее значение. Никакие nexts, lambdas, полностью измененные или itertools не требуются.
Я приехал сюда в надежде найти кого-то, кто уже выполнил работу по написанию самой эффективной версии list.rindex , которая предоставила полный интерфейс list.index (включая дополнительные start и stop параметры) . Я не нашел этого в ответах на этот вопрос, или здесь, или здесь или здесь. Так что я собрал это все вместе . используя предложения из других ответов на этот и другие вопросы.
Техника с использованием len(seq) — 1 — next(i for i,v in enumerate(reversed(seq)) if v == value) , предложенная в нескольких других ответах, может быть более компактной: она не должна создавать обратную копию полного списка. Но в моем (случайном, случайном) тестировании это примерно на 50% медленнее.
С dict
Вы можете использовать тот факт, что словарные ключи являются уникальными, и при создании ключа с кортежами будет использоваться только последнее присвоение значения для определенного ключа. Как указано в других ответах, это подходит для небольших списков, но создает словарь для всех уникальных значений и может быть неэффективным для больших списков.
Вот небольшая строка для получения последнего индекса с использованием enumerate и понимание списка:
How to obtain the last index of a list?
How do I obtain the last index, which in this case would be 3, of that list?
8 Answers 8
len(list1)-1 is definitely the way to go, but if you absolutely need a list that has a function that returns the last index, you could create a class that inherits from list .
The best and fast way to obtain the content of the last index of a list is using -1 for number of index , for example:
Index -1 shows you the last index or first index of the end.
But if you want to get only the last index, you can obtain it with this function:
In this case, the input is the list, and the output will be an integer which is the last index number.