检查一个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
声明都更可读。