【问题标题】:Check if list items contains substrings from another list检查列表项是否包含来自另一个列表的子字符串
【发布时间】:2012-07-04 22:46:42
【问题描述】:

我有一个清单:

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

bad = ['abc', 'def']

并且想要搜索包含字符串 'abc' 和 'def' 的项目(以及其他错误的)。我该怎么做?

几乎相同的问题here

【问题讨论】:

  • 您究竟尝试了哪些方法,哪些方法不起作用?
  • 你当前的代码是什么样的?

标签: python list


【解决方案1】:

如果你只是想要一个测试,将目标列表加入一个字符串并测试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}
  • 你为我节省了一天
【解决方案2】:
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"]
【解决方案3】:
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

这很简单,运行良好且快速(仅当您的列表不是很大时。)

【讨论】:

  • if any(item in s): TypeError: 'bool' object is not iterable
  • 我猜应该是if item in s:
【解决方案4】:
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])

【讨论】:

  • 虽然这段代码 sn-p 可以回答这个问题,但它没有提供任何上下文来解释如何或为什么。考虑添加一两句话来解释你的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 2022-11-14
  • 2013-02-20
  • 1970-01-01
相关资源
最近更新 更多