Как проверить, содержит ли элемент списка некоторую подстроку - PullRequest
0 голосов
/ 23 октября 2019

Приведенный ниже код не работает должным образом и выглядит как оптимизация поиска по всему списку вместо каждого элемента в отдельности и всегда возвращает значение true.

Намеченный код предназначен для поиска подстроки в каждом элементе спискатолько в каждой итерации и верните true или false. Но на самом деле он просматривает полный список.

В приведенном ниже коде оператор print печатает полный список внутри <<>>, если я использую find () или в операторе, но печатает только одно слово, если я использую оператор ==.

Код вопроса:

def myfunc(mylist):
    for i in range(len(mylist)):
        count = 0
        for word in mylist:
            print('<<{}>>'.format(word))
            if str(word).casefold().find('abc') or 'def' in str(word).casefold():
                count += 1
                abcdefwordlist.append(str(word)) 
                break

Этот код выполняет поиск слов "abc" или "def" в моем списке слов вместо слова.

Если я использую str(word).casefold() == 'abc' or str(word).casefold() == 'def', тогдаэто сравнивается только со словом. Как я могу проверить, содержит ли слово «abc» или «def» в таком цикле.

1 Ответ

1 голос
/ 23 октября 2019

У вас есть несколько проблем здесь.

  1. abcdefwordlist не определено (по крайней мере, не в том коде, который вы нам показали).
  2. Вы перебираете по длине списка, а затем по списку словсамо по себе, что означает, что слишком много элементов будет добавлено в ваш результирующий массив.
  3. Эта функция ничего не возвращает, если только вы не хотели обновить abcdefwordlist извне.

У вас была правильная идея с 'def' in str(word), но вы должны использовать ее для обеих подстрок. Подводя итог, можно сказать, что функция, которая делает то, что вы хотите, будет выглядеть следующим образом:

def myfunc(mylist):
    abcdefwordlist = [] # unless it already exists elsewhere
    for word in mylist:
        if 'abc' in str(word).lower() or 'def' in str(word).lower():
            abcdefwordlist.append(word)
    return abcdefwordlist

Это также можно отсортировать в одну строку, используя понимание списка:

def myfunc(mylist):
    return [word for word in mylist if 'abc' in str(word).lower() or 'def' in str(word).lower()]

КСТАТИ Iиспользовал lower() вместо casefold(), потому что подстроки, которые я ищу, определенно строчные

...