Поиск подстроки в списке в 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'
из списка.
Ответы
Ответ 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