0

Получить индекс первого элемента списка, содержащего подстроку?

8

Заголовок вопроса: Как найти индекс элемента в списке, основываясь на содержимом его строк?

Текст вопроса:

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

Например, вот мой список:

l = ['the cat ate the mouse',
     'the tiger ate the chicken',
     'the horse ate the straw']

Я хочу получить индекс 1, если я передам аргумент tiger. Какой самый "питонический" способ сделать это?

5 ответ(ов)

0

Вот оптимизированная версия решения задачи, которая останавливается, когда совпадение найдено:

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()

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

0

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

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. Это обеспечивает простой и эффективный способ поиска подстроки в списке строк.

0

Вы можете использовать следующий однострочный код для поиска индекса первого вхождения строки, содержащей 'tiger', в списке l:

index = next(i for i, s in enumerate(l) if 'tiger' in s)
0

Ваша функция 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, что делает код более компактным и читаемым.

0

Это довольно элегантно и довольно эффективно.

>>> 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 вместо возникновения исключения.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь