Получить индекс первого элемента списка, содержащего подстроку?
Заголовок вопроса: Как найти индекс элемента в списке, основываясь на содержимом его строк?
Текст вопроса:
У меня есть список строк, и я хочу найти индекс элемента, который содержит определенное слово. Метод list.index(x)
возвращает индекс первого элемента, совпадающего с x
, но мне нужно искать внутри каждого элемента списка, а не сравнивать целиком.
Например, вот мой список:
l = ['the cat ate the mouse',
'the tiger ate the chicken',
'the horse ate the straw']
Я хочу получить индекс 1
, если я передам аргумент tiger
. Какой самый "питонический" способ сделать это?
5 ответ(ов)
Вот оптимизированная версия решения задачи, которая останавливается, когда совпадение найдено:
def first_substring(strings, substring):
return next(i for i, string in enumerate(strings) if substring in string)
Если вы используете версию Python до 2.6, вам нужно будет вызвать next()
в конце. Вот как это будет выглядеть:
def first_substring(strings, substring):
return (i for i, string in enumerate(strings) if substring in string).next()
Таким образом, эта функция находит первый индекс строки, содержащей заданную подстроку, и останавливается сразу же, как только находит совпадение.
Вы можете использовать следующий метод, чтобы найти индекс строки, содержащей заданную подстроку в списке. Этот код не использует никаких дополнительных библиотек и работает с помощью простого цикла:
def index_containing_substring(the_list, substring):
for i, s in enumerate(the_list):
if substring in s:
return i
return -1
В этой функции мы перебираем все строки в the_list
с использованием enumerate
, что позволяет одновременно получить индекс i
и саму строку s
. Если подстрока, заданная в substring
, найдена в строке s
, функция возвращает индекс i
. Если подстрока не найдена ни в одной из строк, функция вернет -1
. Это обеспечивает простой и эффективный способ поиска подстроки в списке строк.
Вы можете использовать следующий однострочный код для поиска индекса первого вхождения строки, содержащей 'tiger', в списке l
:
index = next(i for i, s in enumerate(l) if 'tiger' in s)
Ваша функция find
ищет подстроку s
в списке строк l
и возвращает индекс первого вхождения, или None
(или -1
), если подстрока не найдена. Вот пример перевода этого кода на русский в стиле ответа на StackOverflow:
def find(l, s):
for i in range(len(l)):
if l[i].find(s) != -1:
return i
return None # Или -1
Эта функция перебирает все элементы списка l
и проверяет, содержится ли строка s
в каждом элементе. Если находится совпадение, возвращается индекс первого найденного вхождения. Если строка не найдена ни в одном из элементов, функция возвращает None
, что можно заменить на -1
, если вам удобнее использовать числовое значение.
Помимо использования find
, вы также можете воспользоваться оператором in
, что сделает код более читаемым:
def find(l, s):
for i, item in enumerate(l):
if s in item:
return i
return None # Или -1
В этом варианте используется enumerate
, что делает код более компактным и читаемым.
Это довольно элегантно и довольно эффективно.
>>> def find(lst, predicate):
... return (i for i, j in enumerate(lst) if predicate(j)).next()
...
>>> l = ['the cat ate the mouse','the tiger ate the chicken','the horse ate the straw']
>>> find(l, lambda x: 'tiger' in x)
1
Однако, есть одна проблема: если элемент не найден, возникнет исключение StopIteration
(хотя это легко исправить).
Чтобы избежать этой проблемы, можно использовать функцию next()
с аргументом по умолчанию, который будет возвращаться в случае отсутствия соответствующего элемента:
def find(lst, predicate):
return next((i for i, j in enumerate(lst) if predicate(j)), None)
Теперь, если элемент не будет найден, функция вернет None
вместо возникновения исключения.
Как получить последний элемент списка?
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Диапазон букв в Python
Нахождение среднего значения списка
Вывод списка в обратном порядке с помощью функции range()