Поиск Индекса в Списке Python: Найти Первое, Последнее или Все Вхождения

В этом руководстве вы научитесь использовать метод index списка Python для нахождения индекса (или индексов) элемента в списке. Метод копирует поведение метода indexOf() во многих других языках, таких как JavaScript. Умение работать со списками Python является важным навыком для Python-разработчика любого уровня. Мы рассмотрим, как найти один элемент, несколько элементов и элементы, соответствующие определенному условию.

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

  • Как работает метод Python list.index()

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

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

  • Как найти индексы элементов, соответствующих условию

  • Как использовать альтернативные методы, такие как понимание списка, чтобы найти индекс элемента в списке.

Оглавление

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

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

Давайте посмотрим на синтаксис метода index()

# Объяснение метода list.index()
list.index(
    element,    # Элемент для поиска
    start,      # Индекс, с которого начинается поиск
    end         # Индекс, на котором заканчивается поиск
)

Давайте подробнее рассмотрим эти параметры:

  • element= представляет собой элемент, который нужно искать в списке

  • start= является необязательным параметром, который указывает, с какой позиции начинать поиск

  • end= является необязательным параметром, который указывает, до какой позиции индекса следует выполнять поиск

Метод возвращает индекс данного элемента, если он существует. Имейте в виду, что будет возвращен только первый индекс. Кроме того, если элемент не существует, будет вызвано исключение ValueError.

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

Найдите индексную позицию элемента в списке Python

Давайте рассмотрим, как работает метод list.index() в Python. В этом примере мы будем искать позицию элемента в списке, о которой знаем, что элемент есть в списке.

Давайте представим, что у нас есть список веб-сайтов, которые мы открываем утром, и мы хотим узнать, в какие моменты мы открывали 'bemind'

# Нахождение индекса элемента в списке
a_list = ['bemind', 'twitter', 'facebook', 'twitter', 'tiktok', 'youtube']
print(a_list.index('bemind'))

# Вывод: 0

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

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

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

К сожалению, Python не предоставляет простого способа для этого. Тем не менее, мы можем использовать невероятно универсальную функцию enumerate() и цикл for для выполнения этой задачи. Функция enumerate итерирует элементы и возвращает как позицию индекса, так и значение.

Давайте посмотрим, как мы можем найти все позиции индекса элемента в списке, используя цикл for и функцию enumerate():

# Поиск всех индексов элемента в списке
def find_indices(search_list, search_item):
    indices = []
    for (index, item) in enumerate(search_list):
        if item == search_item:
            indices.append(index)

    return indices

a_list = ['bemind.gitbook.io', 'twitter', 'facebook', 'twitter', 'tiktok', 'youtube']
print(find_indices(a_list, 'twitter'))

# Вывод: [1, 3]

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

  1. Мы определили функцию find_indices(), которая принимает два аргумента: список для поиска и элемент, который нужно найти.

  2. Функция создает пустой список для сохранения любой найденной позиции индекса.

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

  4. Функция оценивает каждый элемент, чтобы определить, равен ли он искомому термину. Если это так, индекс добавляется в список.

  5. Наконец, этот список возвращается

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

# Укороченная функция для возврата всех индексов элемента в списке
def find_indices(search_list, search_item):
    return [index for (index, item) in enumerate(search_list) if item == search_item]

a_list = ['bemind', 'twitter', 'facebook', 'twitter', 'tiktok', 'youtube']
print(find_indices(a_list, 'twitter'))

# Вывод: [1, 3]

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

Найдите последнюю индексную позицию элемента в списке Python

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

Для маленьких списков давайте использовать этот более простой подход:

# Поиск последней позиции индекса элемента в списке
def find_last_index(search_list, search_item):
    return len(search_list) - 1 - search_list[::-1].index(search_item)

a_list = ['bemind', 'twitter', 'facebook', 'twitter', 'tiktok', 'youtube']

print(find_last_index(a_list, 'twitter'))

# Вывод: 3

В этом подходе функция вычитает следующие значения:

  • len(search_list) возвращает длину списка

  • 1, поскольку индексы начинаются с 0

  • .index() инвертированного списка

Есть две основные проблемы с этим подходом:

  1. Если элемент не существует, будет вызвано исключение ValueError

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

Рассмотрим другой подход, при котором цикл обрабатывает список в обратном порядке. Это избавляет от необходимости дублировать список.

# Более сложный, но более эффективный по памяти способ нахождения последнего индекса элемента
def find_last_index(search_list, search_item):
    i = len(search_list) - 1
    while i >= 0:
        if search_list[i] == search_item:
            return i
        else:
            i -= 1
            
a_list = ['bemind', 'twitter', 'facebook', 'twitter', 'tiktok', 'youtube']

print(find_last_index(a_list, 'twitter'))

# Вывод: 3

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

Индекс элемента, отсутствующего в списке Python

По умолчанию метод list.index() в Python выдаст ошибку ValueError, если элемент не присутствует в списке. Давайте посмотрим, как это выглядит. Мы попробуем найти термин 'pinterest' в нашем списке:

# Поиск элемента, который не существует
a_list = ['bemind', 'twitter', 'facebook', 'twitter', 'tiktok', 'youtube']

print(a_list.index('pinterest'))

# Вызывает: ValueError: 'pinterest' не в списке

Когда Python выдает эту ошибку, вся программа останавливается. Мы можем обойти это, вложив ее в блок try-except.

# Обработка ошибки, когда элемент не существует
a_list = ['bemind', 'twitter', 'facebook', 'twitter', 'tiktok', 'youtube']

try:
    print(a_list.index('pinterest'))
except ValueError:
    print("Элемент не существует!")

# Вывод: Элемент не существует!

Работа с параметрами метода индекса списка

Метод list.index() в Python также предоставляет два дополнительных параметра: start= и stop=. Эти параметры соответственно указывают позиции, с которых начинается и заканчивается поиск.

Допустим, мы хотели бы начать поиск со второго индекса и закончить на шестом, мы могли бы написать:

# Использование параметров начала и конца в list.index()
a_list = ['bemind', 'twitter', 'facebook', 'twitter', 'tiktok', 'youtube']

print(a_list.index('twitter', 2, 6))

# Вывод: 3

Путем указания метода начать с индекса 2, метод пропускает первое вхождение строки 'twitter'.

Поиск всех индексов элементов, соответствующих условию

В этом последнем разделе мы рассмотрим, как найти индексные позиции всех элементов, которые соответствуют определенному условию. Допустим, например, что мы хотим найти все индексные позиции элементов, содержащих букву 'y'. Мы могли бы использовать подход, описанный выше, где мы находим индексные позиции всех элементов. Однако, мы добавим дополнительное условие к нашей проверке:

# Нахождение индексов элементов, соответствующих условию
def find_indices(search_list, search_item):
    return [index for (index, item) in enumerate(search_list) if search_item in item]


a_list = ['bemind.gitbook.io', 'twitter', 'facebook', 'twitter', 'tiktok', 'youtube']
print(find_indices(a_list, 'y'))

# Вывод:
# [0, 5]

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

Заключение

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

Наконец, вы научились обрабатывать ошибки, когда элемент не существует, а также как находить индексы элементов, соответствующих условию.

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

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

Last updated