Python: Найти Индекс Всех Вхождений Элемента в Списке

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

К концу этого урока вы узнаете:

  • Как найти индексы всех вхождений элемента в список Python, используя:

    • Для петель

    • Список понятий

    • NumPy и

    • more_itertools

  • Какой метод самый быстрый

Оглавление

Как работают индексы списков Python

Прежде чем перейти к тому, как получить индексные позиции всех элементов в списке Python, давайте ненадолго остановимся, чтобы понять, как индексируются списки Python. Поскольку списки Python упорядочены, их порядок сохраняется, если он явно не изменён.

Индексы списков в Python начинаются с 0 и продолжаются до длины списка минус один. Ниже приведено изображение, показывающее, как работают эти индексы списков в Python:

В следующем разделе вы узнаете, как использовать метод .index() списка для нахождения индекса элемента в списке.

Как работает метод индексирования списка Python

В Python метод списка .index() имеет три параметра:

  1. Элемент для поиска

  2. Индекс, начиная с которого идет поиск

  3. Индекс для поиска до

Единственным обязательным аргументом является элемент, который нужно найти. По умолчанию Python будет осуществлять поиск по всему списку, если не указано иное.

Давайте посмотрим, как выглядит этот метод:

# Метод list.index()
list.index(
    value=,     # Значение, которое нужно найти
    start=,     # Индекс, с которого начать поиск
    stop=       # Индекс, на котором закончить поиск
)

Рассмотрим пример. Мы можем загрузить список с различными элементами и найти индекс элемента, используя метод .index()

# Использование метода .index()
a_list = [1,2,3,4,1,2,1,2,3,4]
print(a_list.index(1))

# Возвращает: 0

В приведенном выше примере мы использовали метод .index() для нашего списка, чтобы найти индекс элемента 1. Метод вернул значение 0, что означает, что элемент находится на 0-й позиции. Однако мы знаем, что значение встречается в списке несколько раз.

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

В следующих разделах вы узнаете, как получить индексные позиции всех вхождений элемента в список.

Как получить индекс всех вхождений элемента в список Python с помощью цикла for и перечисления

Один из самых основных способов получения индексных позиций всех вхождений элемента в список Python - использование цикла for и функции enumerate Python. Функция enumerate используется для итерации по объекту и возвращает как индекс, так и элемент.

Исходя из этого, мы можем проверить, соответствует ли элемент искомому нами элементу. Если это так, мы можем добавить позицию индекса в другой список. Давайте посмотрим, как это работает на примере:

# Использование функции enumerate для нахождения позиций индексов
a_list = [1,2,3,4,1,2,1,2,3,4]
def find_indices(list_to_check, item_to_find):
    indices = []
    for idx, value in enumerate(a_list):
        if value == item_to_find:
            indices.append(idx)
    return indices

print(find_indices(a_list, 1))

# Возвращает: [0, 4, 6]

Давайте разберем, что мы здесь сделали:

  1. Мы определили функцию, которая принимает список и элемент в качестве входных данных.

  2. Функция затем проходит в цикле по результату функции enumerate()

  3. Если значение элемента совпадает с искомым элементом, соответствующий индекс добавляется в список.

  4. В конце возвращается список всех индексов

Как получить индекс всех вхождений элемента в список Python с помощью more_itertools

Встроенная библиотека more_itertools включает в себя множество полезных функций. Одной из таких функций является функция locate(), которая принимает итерируемый объект и функцию для оценки.

Чтобы найти индексные позиции всех элементов, совпадающих с элементом, мы можем использовать лямбда-функцию, которая просто проверяет, равен ли этот элемент элементу, с которым мы хотим сравнить.

Давайте посмотрим на пример:

# Использование more_itertools для нахождения всех вхождений элемента
from more_itertools import locate
a_list = [1,2,3,4,1,2,1,2,3,4]
def find_indices(list_to_check, item_to_find):
    indices = locate(list_to_check, lambda x: x == item_to_find)
    return list(indices)
    
print(find_indices(a_list, 1))

# Возвращает: [0, 4, 6]

Давайте разберем, что мы здесь сделали:

  1. Мы определили функцию, которая принимает список и элемент для поиска.

  2. Функция использует функцию locate() для поиска в списке, который мы хотим исследовать, и лямбда-функцию, которая проверяет, равен ли каждый элемент искомому значению.

  3. В конце функция возвращает список результата

Как получить индекс всех вхождений элемента в список Python с помощью Numpy

NumPy значительно упрощает и ускоряет процесс поиска всех позиций элемента в списке. Для этого можно использовать функцию where(). Функция where() возвращает позиции индексов всех элементов в массиве, которые соответствуют заданному значению.

Давайте посмотрим на пример:

# Использование numpy для нахождения всех вхождений элемента
import numpy as np

a_list = [1,2,3,4,1,2,1,2,3,4]
def find_indices(list_to_check, item_to_find):
    array = np.array(list_to_check)
    indices = np.where(array == item_to_find)[0]
    return list(indices)

print(find_indices(a_list, 1))

# Возвращает: [0, 4, 6]

Давайте разберем, что мы здесь сделали:

  1. Мы создали функцию, которая принимает список и элемент, который нужно найти.

  2. Список преобразован в массив numpy

  3. Функция where() используется для проверки соответствия элемента массиву.

  4. Мы возвращаем 0-й индекс полученного массива

  5. Мы конвертируем этот массив в список

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

В этом разделе мы рассмотрим, как использовать генератор списка для возвращения списка индексов элемента в списке. Этот метод работает так же, как и первый метод, цикл for, кроме использования генератора списка.

Давайте посмотрим, как мы можем преобразовать цикл for в понимание списка:

# Использование генератора списка для нахождения всех вхождений элемента
a_list = [1,2,3,4,1,2,1,2,3,4]
def find_indices(list_to_check, item_to_find):
    return [idx for idx, value in enumerate(list_to_check) if value == item_to_find]

print(find_indices(a_list, 1))

# Возвращает: [0, 4, 6]

Метод, показанный выше, гораздо более чистый и легкий для чтения, чем цикл for. В следующем разделе мы рассмотрим, как эти различные методы сравниваются по скорости.

Какой метод быстрее всего получить индекс всех вхождений элемента в список Python

Таблица ниже демонстрирует, сколько времени потребовалось каждому методу, чтобы найти индексы всех вхождений в списке из ста миллионов элементов:

Метод
Время выполнять

Для цикла и enumerate()

4.97 seconds

more_itertools locate()

7.08 seconds

numpy where()

6.05 seconds

Понимание списков и enumerate()

4.69 seconds

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

Заключение

В этом учебнике вы узнали, как найти индексные позиции всех вхождений элемента в список Python. Вы научились делать это с использованием функции enumerate() Python как с помощью циклов for, так и с использованием списковых включений. Вы также узнали, как использовать функцию where() numpy и функцию locate() из библиотеки more_itertools.

Дополнительные ресурсы

Чтобы узнать больше о связанных темах, ознакомьтесь с нижеследующими учебными материалами:

  • Индекс списка Python: поиск первого, последнего или всех вхождений

  • Python IndexError: объяснение ошибки индекса списка вне диапазона

  • Python: получить индекс максимального элемента в списке

Last updated