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

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

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

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

Оглавление

* [Объяснение метода индексирования списка Python](#obyasnenie-metoda-indeksirovaniya-spiska-python)
* [Найдите индексную позицию элемента в списке Python](#naidite-indeksnuyu-poziciyu-elementa-v-spiske-python)
* [Поиск всех индексов элемента в списке Python](#poisk-vsekh-indeksov-elementa-v-spiske-python)
* [Найдите последнюю индексную позицию элемента в списке Python](#naidite-poslednyuyu-indeksnuyu-poziciyu-elementa-v-spiske-python)
* [Индекс элемента, отсутствующего в списке Python](#indeks-elementa-otsutstvuyushego-v-spiske-python)
* [Работа с параметрами метода индекса списка](#rabota-s-parametrami-metoda-indeksa-spiska)
* [Поиск всех индексов элементов, соответствующих условию](#poisk-vsekh-indeksov-elementov-sootvetstvuyushikh-usloviyu)
* [Заключение](#zaklyuchenie)
* [Дополнительные ресурсы](#dopolnitelnye-resursy)

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

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

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

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

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

* `element=` представляет собой элемент, который нужно искать в списке
* `start=` является необязательным параметром, который указывает, с какой позиции начинать поиск
* `end=` является необязательным параметром, который указывает, до какой позиции индекса следует выполнять поиск

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

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

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

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

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

```python
# Нахождение индекса элемента в списке
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():`

```python
# Поиск всех индексов элемента в списке
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](https://datagy.io/list-comprehensions-in-python/). Давайте посмотрим, как это выглядит:

```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

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

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

```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. Функция создаёт копию списка. Для небольших списков это может быть приемлемо, но для больших списков такой подход может потребовать значительных вычислительных ресурсов.

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

```python
# Более сложный, но более эффективный по памяти способ нахождения последнего индекса элемента
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'` в нашем списке:

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

print(a_list.index('pinterest'))

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

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

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

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

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

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

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

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

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

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

# Вывод: 3
```

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

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

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

```python
# Нахождение индексов элементов, соответствующих условию
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. Вы узнали, как работает метод и как использовать его для поиска индексной позиции искомого термина. Также вы научились находить индексные позиции элементов, которые встречаются более одного раза, а также находить последнюю индексную позицию элемента.

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

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

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

* Списки Python: полный обзор
* Zip-списки Python — заархивируйте два или более списков в Python
* Python IndexError: объяснение ошибки индекса списка вне диапазона
* [Индекс списка Python: официальная документация](https://docs.python.org/3/tutorial/datastructures.html)
