Проверьте, содержит ли элемент списка Python строку внутри другой строки - PullRequest
474 голосов
/ 30 января 2011

У меня есть список:

my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']

и хотите найти элементы, содержащие строку 'abc'. Как я могу это сделать?

if 'abc' in my_list:

проверит, существует ли 'abc' в списке, но оно является частью 'abc-123', а 'abc-456', 'abc' не существует само по себе. Так как же я могу получить все предметы, которые содержат 'abc'?

Ответы [ 15 ]

777 голосов
/ 30 января 2011

Если вы хотите проверить наличие abc в любой строке списка, вы можете попробовать

some_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
if any("abc" in s for s in some_list):
    # whatever

Если вы действительно хотите получить все элементы, содержащие abc, используйте

matching = [s for s in some_list if "abc" in s]
74 голосов
/ 30 января 2011

Используйте filter, чтобы получить элементы, которые имеют abc.

>>> lst = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
>>> print filter(lambda x: 'abc' in x, lst)
['abc-123', 'abc-456']

Вы также можете использовать понимание списка.

>>> [x for x in lst if 'abc' in x]

Кстати, не используйте слово list в качестве имени переменной, поскольку оно уже используется для типа list.

69 голосов
/ 03 августа 2014

Просто добавьте это: если вам нужно сопоставить более чем одну строку, например, abc и def, вы можете объединить два понимания списка следующим образом:

matchers = ['abc','def']
matching = [s for s in my_list if any(xs in s for xs in matchers)]

Выход:

['abc-123', 'def-456', 'abc-456']
37 голосов
/ 13 апреля 2016

Если вам просто нужно знать, есть ли «abc» в одном из пунктов, это самый короткий путь:

if 'abc' in str(my_list):
18 голосов
/ 20 октября 2011

Это довольно старый вопрос, но я предлагаю этот ответ, потому что предыдущие ответы не справляются с элементами в списке, которые не являются строками (или неким итеративным объектом).Такие элементы могут привести к сбою в понимании всего списка с исключением.

Чтобы изящно обрабатывать такие элементы в списке, пропуская не повторяемые элементы, используйте следующее:

[el for el in lst if isinstance(el, collections.Iterable) and (st in el)]

тогда с таким списком:

lst = [None, 'abc-123', 'def-456', 'ghi-789', 'abc-456', 123]
st = 'abc'

вы все равно получите соответствующие элементы (['abc-123', 'abc-456'])

. Тест на итерируемость может быть не лучшим.Получил это здесь: В Python, как определить, является ли объект итеративным?

10 голосов
/ 30 января 2011
for item in my_list:
    if item.find("abc") != -1:
        print item
10 голосов
/ 30 января 2011
x = 'aaa'
L = ['aaa-12', 'bbbaaa', 'cccaa']
res = [y for y in L if x in y]
5 голосов
/ 30 января 2011
any('abc' in item for item in mylist)
2 голосов
/ 07 апреля 2018

Я новичок в Python.Я получил работающий код ниже и сделал его понятным:

my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for str in my_list:
    if 'abc' in str:
       print(str)
1 голос
/ 08 февраля 2019

Используйте метод __contains__() класса строки Pythons .:

a = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
for i in a:
    if i.__contains__("abc") :
        print(i, " is containing")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...