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

我有一个列表:

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

并且想要搜索包含字符串'abc' 。 我怎样才能做到这一点?

 if 'abc' in my_list: 

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

如果您只想检查列表中任何字符串中是否存在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] 

使用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类型。

只是把它扔到那里:如果你碰巧需要匹配多个字符串,例如abcdef ,你可以把两个列表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'] 

这是一个相当古老的问题,但我提供了这个答案,因为以前的答案不能处理列表中不是字符串(或某种可迭代对象)的项目。 这些项目会导致整个列表理解失败,例外。

要通过跳过不可迭代的项目来优雅地处理列表中的这些项目,请使用以下命令:

 [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中,如何确定一个对象是否可迭代?

这是最短的方法:

 if 'abc' in str(my_list): 
 x = 'aaa' L = ['aaa-12', 'bbbaaa', 'cccaa'] res = [y for y in L if x in y] 
 for item in my_list: if item.find("abc") != -1: print item 
 any('abc' in item for item in mylist) 

据我所知,一个“for”语句总是会消耗时间。

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

我认为,用'is'语句搜索一个字符串中的子字符串要快一点。

 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声明都更可读。