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

27
我有一个列表:
my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456', 'def-111', 'qwe-111']

bad = ['abc', 'def']

我想查找包含字符串'abc'和'def'(及其他内容中含有这两个字符串)的项目。我该如何做?

几乎相同的问题在这里


5
你尝试了什么,有哪些东西不起作用? - msvalkon
你现在的代码是什么样子? - Mizipzor
4个回答

45
如果你只是想进行测试,将目标列表连接成字符串,并像下面这样测试bad的每个元素:
>>> my_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456', 'def-111', 'qwe-111']
>>> bad = ['abc', 'def']
>>> [e for e in bad if e in '\n'.join(my_list)]
['abc', 'def']

从你的问题中,你可以通过以下方式将每个元素作为子字符串与其他元素进行测试:

>>> [i for e in bad for i in my_list if e in i]
['abc-123', 'abc-456', 'def-456', 'def-111']

相对于另一种方法,它速度较快:

>>> def f1():
...    [item for item in my_list if any(x in item for x in bad)]
... 
>>> def f2():
...    [i for e in bad for i in my_list if e in i]
... 
>>> timeit.Timer(f1).timeit()
5.062238931655884
>>> timeit.Timer(f2).timeit()
1.35371994972229

根据您的评论,以下是获取不匹配元素的方法:

>>> set(my_list)-{i for e in bad for i in my_list if e in i}
{'ghi-789', 'qwe-111'}

@Alex:使用集合:set(my_list)-{i for e in bad for i in my_list if e in i} - dawg
你为我节省了一天时间。 - Sakeer

13
In [4]: filter(lambda item: any(x in item for x in bad), my_list)
Out[4]: ['abc-123', 'def-456', 'abc-456', 'def-111']
或者
In [13]: [item for item in my_list if any(x in item for x in bad)]
Out[13]: ['abc-123', 'def-456', 'abc-456', 'def-111']

不错的解决方案。我希望能够得到相反的输出,即需要获取不匹配的项。例如:[''ghi-789'', "qwe-111"] - iamnewuser

2
some_list = ['abc-123', 'def-456', 'ghi-789', 'abc-456']
bad = ['abc', 'def']
for s in some_list:
    for item in bad:
       if item in s:
          print 'Found ', s

如果您的列表不是非常庞大,它就很简单、运行良好且速度快。


如果任何一个元素在s中: 类型错误:'bool'对象不可迭代 - Alex
1
应该是 if item in s: 我猜。 - jadkik94

0
some_list=['abc-123', 'def-456', 'ghi-789', 'abc-456']
bad = ['abc', 'def']
for i in range (0,len(bad)):
    if bad[i] in some_list:
        print('Found a bad entry:', bad[i])

虽然这段代码片段可能回答了问题,但它没有提供任何上下文来解释如何或为什么。考虑添加一两句话来解释你的答案。 - brandonscript

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接