检查一个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类型。
只是把它扔到那里:如果你碰巧需要匹配多个字符串,例如abc和def ,你可以把两个列表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声明都更可读。