Поиск индекса элемента с помощью index в Python
Основы метода index()
Метод index() возвращает индекс первого вхождения указанного значения в списке, кортеже или строке. Синтаксис: коллекция.index(значение, [start, [stop]]). Параметры start и stop задают диапазон поиска (необязательно). Если элемент не найден, возникает исключение ValueError.
# Пример со списком
numbers = [10, 20, 30, 20, 40]
idx = numbers.index(20)
print(idx) # 1 (первое вхождение)
# Строка
text = "Python"
pos = text.index('t')
print(pos) # 2
# Кортеж
tuple_data = (1, 2, 3, 2)
pos = tuple_data.index(2)
print(pos) # 1
Python set list (set и list в python: различия и использование)
Типичная ошибка: вызов index() для отсутствующего элемента приводит к ValueError. Например, [1,2].index(3) вызовет исключение. Решение: предварительно проверять наличие через in или использовать блок try/except.
Как найти индекс элемента с учётом диапазона поиска?
Метод index() принимает необязательные аргументы start и stop, ограничивающие участок коллекции для поиска. Это полезно для поиска второго или последующего вхождения.
items = ['a', 'b', 'c', 'b', 'd']
first_b = items.index('b') # 1
second_b = items.index('b', 2) # 3 (поиск начиная с индекса 2)
print(first_b, second_b)
Python пары значений (пары значений в python)
Если указать start больше длины коллекции или stop меньше start, возникнет ValueError или пустой результат. Всегда проверяйте границы.
Как избежать ValueError, когда элемента нет в коллекции?
Самый надёжный способ - проверить наличие элемента оператором in перед вызовом index().
my_list = [1, 2, 3]
value = 4
if value in my_list:
idx = my_list.index(value)
else:
print("Элемент не найден")
Python object get (метод get для объектов в python)
Альтернатива - перехват исключения:
try:
idx = my_list.index(value)
print(f"Индекс: {idx}")
except ValueError:
print("Элемент отсутствует")
Python get keys (метод get для словарей в python)
Как получить все индексы вхождения элемента?
Метод index() возвращает только первый индекс. Для поиска всех вхождений используется цикл с изменяемым start или list comprehension.
# Цикл со сдвигом start
def find_all(lst, value):
indices = []
start = 0
while True:
try:
idx = lst.index(value, start)
indices.append(idx)
start = idx + 1
except ValueError:
break
return indices
print(find_all([1,2,3,2,4,2], 2)) # [1, 3, 5]
Get index python (метод index в python)
# Через enumerate и list comprehension
lst = [1,2,3,2,4,2]
indices = [i for i, x in enumerate(lst) if x == 2]
print(indices) # [1, 3, 5]
Python get methods (методы get в python)
При использовании цикла с try/except важно не забывать обновлять start на idx+1, иначе возникнет бесконечный цикл.
Как найти индекс элемента по условию (первый подходящий)?
Для поиска индекса по произвольному условию удобно использовать функцию next() с генератором.
# Найти индекс первого положительного числа
data = [-5, 0, 3, -1, 7]
idx = next((i for i, x in enumerate(data) if x > 0), None)
print(idx) # 2
Второй аргумент None - значение по умолчанию, если ни один элемент не удовлетворяет условию.
Если не указать значение по умолчанию, при отсутствии подходящего элемента возникнет исключение StopIteration.
Расширенные примеры использования метода index()
Поиск в строке с учетом регистра
text = "Python programming"
pos = text.index('p') # 0, так как 'P' заглавная, 'p' строчная
print(pos)
# Если нужен регистронезависимый поиск:
pos_lower = text.lower().index('p') # 0
print(pos_lower)
0 0
Поиск индекса с отрицательными start и stop
# Отрицательный start отсчитывается от конца
lst = [10, 20, 30, 40, 50]
idx = lst.index(30, -4, -1) # start = -4 (индекс 1), end = -1 (индекс 4)
print(idx) # 2
Важно: отрицательные индексы работают как в срезах. Если stop меньше start, поиск не даст результата.
Поиск в кортеже с дубликатами
t = (1, 2, 3, 2, 4, 2)
# Поиск третьего вхождения '2'
first = t.index(2)
second = t.index(2, first + 1)
third = t.index(2, second + 1)
print(first, second, third) # 1 3 5
Поиск первого элемента, удовлетворяющего условию (через next и lambda)
# Найти индекс первого числа, большего 5
numbers = [1, 3, 7, 2, 9]
idx = next(i for i, val in enumerate(numbers) if val > 5)
print(idx) # 2
Комбинирование index с map и filter
# Список строк, найти индекс первой строки, содержащей 'abc'
strings = ['xyz', 'abcd', 'defabc', 'ghi']
try:
idx = next(i for i, s in enumerate(strings) if 'abc' in s)
print(f"Индекс: {idx}")
except StopIteration:
print("Нет подходящей строки")
# Результат: Индекс: 1
Поиск во вложенном списке (двумерном)
matrix = [[1,2], [3,4], [5,6]]
# Найти индекс строки, содержащей число 4
target = 4
for i, row in enumerate(matrix):
try:
col = row.index(target)
print(f"Строка {i}, столбец {col}")
break
except ValueError:
continue
# Вывод: Строка 1, столбец 1
Поиск индекса в списке объектов по атрибуту
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
people = [Person('Alice', 25), Person('Bob', 30), Person('Charlie', 35)]
# Найти индекс человека с именем 'Bob'
idx = next((i for i, p in enumerate(people) if p.name == 'Bob'), -1)
print(idx) # 1