Подтвердить что ты не робот

Поиск подстроки в списке в Python

Это своего рода работа, но после нескольких часов разочарования и тщательного поиска стека я все еще получаю странное поведение.

Справочная информация:

Список примеров: list = ['abc123', 'def456', 'ghi789']

Я хочу получить элемент, если есть совпадение для подстроки, например abc

Код:

sub = 'abc'
if any(sub in string for string in list):
    print string

И он работает, но он печатает каждый элемент в списке. Аналогично, если я попробую

print any(sub in string for string in list)

он выведет True для каждого элемента в списке.

Я хочу только напечатать элемент в списке, который соответствует подстроке. Поэтому, если я проверяю 'abc', я хочу только распечатать 'abc123' из списка.

4b9b3361

Ответ 1

print [s for s in list if sub in s]

Если вы хотите, чтобы они были разделены символами новой строки:

print "\n".join(s for s in list if sub in s)

Полный пример: с нечувствительностью к регистру:

mylist = ['abc123', 'def456', 'ghi789', 'ABC987', 'aBc654']
sub = 'abc'

print "\n".join(s for s in mylist if sub.lower() in s.lower())

Ответ 2

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

mylist = ['abc123', 'def456', 'ghi789']
sub = 'abc'
next((s for s in mylist if sub in s), None) # returns 'abc123'

Если совпадение находится в конце списка или для очень маленьких списков, это не имеет значения, но рассмотрим этот пример:

import timeit

mylist = ['abc123'] + ['xyz123']*1000
sub = 'abc'

timeit.timeit('[s for s in mylist if sub in s]', setup='from __main__ import mylist, sub', number=100000)
# for me 7.949463844299316 with Python 2.7, 8.568840944994008 with Python 3.4
timeit.timeit('next((s for s in mylist if sub in s), None)', setup='from __main__ import mylist, sub', number=100000) 
# for me 0.12696599960327148 with Python 2.7, 0.09955992100003641 with Python 3.4

Ответ 3

Используйте простой цикл for:

seq = ['abc123', 'def456', 'ghi789']
sub = 'abc'

for text in seq:
    if sub in text:
        print(text)

дает

abc123

Ответ 4

Это печатает все элементы, содержащие sub:

for s in filter (lambda x: sub in x, list): print (s)

Ответ 5

Я бы просто использовал простое регулярное выражение, вы можете сделать что-то вроде этого

import re
old_list = ['abc123', 'def456', 'ghi789']
new_list = [x for x in old_list if re.search('abc', x)]
for item in new_list:
    print item