检查Python列表项是否包含另一个字符串中的字符串

Check if a Python list item contains a string inside another string

我有一个清单:

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

并希望搜索包含字符串'abc'的项。我该怎么做?

1
if 'abc' in my_list:

会检查列表中是否存在'abc',但它是'abc-123''abc-456'的一部分,'abc'本身不存在。那么我怎样才能得到所有包含'abc'的项目呢?


如果您只想检查列表中任何字符串中是否存在abc,可以尝试

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

如果您真的想得到包含abc的所有项目,请使用

1
matching = [s for s in some_list if"abc" in s]


使用filter获取具有abc的元素。

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

您还可以使用列表理解。

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

顺便说一下,不要使用list这个词作为变量名,因为它已经用于list类型。


把这个扔到一边:如果你恰好需要匹配多个字符串,例如abcdef,你可以把两个列表的理解组合起来如下:

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

输出:

1
['abc-123', 'def-456', 'abc-456']


这是最短的路:

1
if 'abc' in str(my_list):


这是一个很古老的问题,但我给出这个答案是因为前面的答案不适用于列表中不是字符串(或某种不可重复的对象)的项目。这样的项目会导致整个列表理解失败,并出现异常。

要优雅地处理列表中的这些项目,请跳过不可重复的项目,请使用以下选项:

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

然后,用这样一个列表:

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

您仍然可以得到匹配的项目(['abc-123', 'abc-456'])

对Iterable的测试可能不是最好的。从这里开始:在Python中,如何确定对象是否是不可访问的?


1
2
3
for item in my_list:
    if item.find("abc") != -1:
        print item


1
2
3
x = 'aaa'
L = ['aaa-12', 'bbbaaa', 'cccaa']
res = [y for y in L if x in y]

1
any('abc' in item for item in mylist)

使用字符串的__contains__()方法。

1
2
3
4
    a = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
    for i in a:
        if i.__contains__("abc") :
            print(i," is containing")

我是Python的新手。下面的代码工作起来很容易理解

1
2
3
4
my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
    for str in my_list:
        if 'abc' in str:
            print(str)

我做了一个搜索,它要求您输入一个特定的值,然后它将从包含您输入的列表中查找一个值:

1
2
3
4
5
6
7
8
9
10
11
12
my_list = ['abc-123',
        'def-456',
        'ghi-789',
        'abc-456'
        ]

imp = raw_input('Search item: ')

for items in my_list:
    val = items
    if any(imp in val for items in my_list):
        print(items)

尝试搜索"abc"。


1
2
3
4
5
mylist=['abc','def','ghi','abc']

pattern=re.compile(r'abc')

pattern.findall(mylist)


1
2
3
4
5
my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']

for item in my_list:
    if (item.find('abc')) != -1:
        print ('Found at ', item)

问题:提供ABC的信息

1
2
3
4
5
6
7
    a = ['abc-123', 'def-456', 'ghi-789', 'abc-456']


    aa = [ string for string in a if "abc" in string]
    print(aa)

Output =>  ['abc-123', 'abc-456']

据我所知,"for"语句总是会耗费时间。

当列表长度增加时,执行时间也将增加。

我认为,在带有"is"语句的字符串中搜索子字符串要快一点。

1
2
3
4
5
6
7
In [1]: t = ["abc_%s" % number for number in range(10000)]

In [2]: %timeit any("9999" in string for string in t)
1000 loops, best of 3: 420 μs per loop

In [3]: %timeit"9999" in",".join(t)
10000 loops, best of 3: 103 μs per loop

但是,我同意any声明更具可读性。