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

от admin

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.

Как найти последнее вхождение элемента в список 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 и понимание списка:

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

Строка считывается со стандартного ввода функцией input() . Напомним, что для двух строк определена операция сложения (конкатенации), также определена операция умножения строки на число.

Строка состоит из последовательности символов. Узнать количество символов (длину строки) можно при помощи функции len .

Любой другой объект в Питоне можно перевести к строке, которая ему соответствует. Для этого нужно вызвать функцию str() , передав ей в качестве параметра объект, переводимый в строку.

2. Срезы (slices)

Срез (slice) — извлечение из данной строки одного символа или некоторого фрагмента подстроки или подпоследовательности.

Есть три формы срезов. Самая простая форма среза: взятие одного символа строки, а именно, S[i] — это срез, состоящий из одного символа, который имеет номер i . При этом считается, что нумерация начинается с числа 0. То есть если , то , , , , .

Номера символов в строке (а также в других структурах данных: списках, кортежах) называются индексом.

Если указать отрицательное значение индекса, то номер будет отсчитываться с конца, начиная с номера -1 . То есть , , , , .

Или в виде таблицы:

Строка S H e l l o
Индекс S[0] S[1] S[2] S[3] S[4]
Индекс S[-5] S[-4] S[-3] S[-2] S[-1]

Если же номер символа в срезе строки S больше либо равен len(S) , или меньше, чем -len(S) , то при обращении к этому символу строки произойдет ошибка IndexError: string index out of range .

Читать:
Как в питоне разложить число на множители

Срез с двумя параметрами: S[a:b] возвращает подстроку из b — a символов, начиная с символа c индексом a , то есть до символа с индексом b , не включая его. Например, S[1:4] == ‘ell’ , то же самое получится если написать S[-4:-1] . Можно использовать как положительные, так и отрицательные индексы в одном срезе, например, S[1:-1] — это строка без первого и последнего символа (срез начинается с символа с индексом 1 и заканчиватеся индексом -1, не включая его).

При использовании такой формы среза ошибки IndexError никогда не возникает. Например, срез S[1:5] вернет строку ‘ello’ , таким же будет результат, если сделать второй индекс очень большим, например, S[1:100] (если в строке не более 100 символов).

Если опустить второй параметр (но поставить двоеточие), то срез берется до конца строки. Например, чтобы удалить из строки первый символ (его индекс равен 0), можно взять срез S[1:] . Аналогично если опустить первый параметр, то можно взять срез от начала строки. То есть удалить из строки последний символ можно при помощи среза S[:-1] . Срез S[:] совпадает с самой строкой S .

Любые операции среза со строкой создают новые строки и никогда не меняют исходную строку. В Питоне строки вообще являются неизменяемыми, их невозможно изменить. Можно лишь в старую переменную присвоить новую строку.

На самом деле в питоне нет и переменных. Есть лишь имена, которые связаны с какими-нибудь объектами. Можно сначала связать имя с одним объектом, а потом — с другим. Можно несколько имён связать с одним и тем же объектом.

Если задать срез с тремя параметрами S[a:b:d] , то третий параметр задает шаг, как в случае с функцией range , то есть будут взяты символы с индексами a , , и т. д. При задании значения третьего параметра, равному 2, в срез попадет кажый второй символ, а если взять значение среза, равное -1 , то символы будут идти в обратном порядке. Например, можно перевернуть строку срезом S[::-1] .

Как найти последнее вхождение элемента в список Python

Насколько мне помогло, нет встроенной функции, которая возвращает последнее вхождение строки (например, обратное к index ). Итак, как я могу найти последнее вхождение «a» в данном списке?

13 ответов

Если вы на самом деле используете только отдельные буквы, как показано в вашем примере, то str.rindex будет работать str.rindex . Это вызывает ValueError если такого элемента нет, тот же класс ошибок, что и list.index . Демо-версия:

Для более общего случая вы можете использовать list.index в обратном списке:

Нарезка здесь создает копию всего списка. Это хорошо для коротких списков, но для случая, когда li очень большой, эффективность может быть лучше с ленивым подходом:

Один лайнер, похожий на Ignacio, за исключением немного более простого/четкого, будет

Мне кажется очень ясным и Pythonic: вы ищете самый высокий индекс, который содержит соответствующее значение. Никаких следов, лямбда, обратных или требуемых.

Многие другие решения требуют итерации по всему списку. Это не так.

Изменить: В ретроспективе это кажется ненужным волшебством. Я бы сделал что-то вроде этого:

Мне нравятся ответы Вим и Игнасио. Тем не менее, я думаю, что itertools предоставляет немного более удобочитаемую альтернативу, несмотря на лямбду. (Для Python 3; для Python 2 используйте xrange вместо range ).

Это StopIteration исключение StopIteration если элемент не найден; вы можете поймать это и вызвать вместо него ValueError , чтобы заставить его вести себя как index .

Определяется как функция, избегая lambda сокращения:

Это работает и для не чаров. Проверено:

Вы можете использовать тот факт, что словарные ключи являются уникальными, и при создании ключа с кортежами будет использоваться только последнее присвоение значения для определенного ключа. Как указано в других ответах, это подходит для небольших списков, но создает словарь для всех уникальных значений и может быть неэффективным для больших списков.

Я пришел сюда, надеясь найти, что кто-то уже выполнил работу по написанию наиболее эффективной версии list.rindex , которая предоставила полный интерфейс list.index (включая необязательные параметры start и stop ). Я не нашел этого в ответах на этот вопрос, или здесь, или здесь, или . Поэтому я собрал это вместе. используя предложения из других ответов на этот и другие вопросы.

Метод с использованием len(seq) — 1 — next(i for i,v in enumerate(reversed(seq)) if v == value) , предложенный в нескольких других ответах, может быть более экономичным: не нужно создавать обратную копию полного списка. Но в моем (удаленном, случайном) тестировании он примерно на 50% медленнее.

Похожие статьи