打破内部列表理解

break inside list comprehension

我有数据列表和过滤器列表,我想使用列表理解方法来搜索数据列表中的任何项目,其字符串包含过滤器列表中的任何单词:

>>> datalist=['mytest123orange','dark angle','double69','spartan','broken image 999','2 cup of tea'] 
>>> filterlist=['test','2','x','123','orange']
>>> print [i for i in datalist if len([ j for j in filterlist if j in i])>0 ]
['test123orange', '2 cup of tea']

一切如我所愿。但问题是要从 len([ j for j in filterlist if j in i ])>0 中获取值,它需要循环过滤列表中的所有项目。因此,即使它与 filterlist 中的第一项匹配,循环也必须执行到最后。例如当 尝试检查 'mytest123orannge',如果过滤器列表中的测试已经匹配它就足够了,我想 'break' 循环所以我不想循环其余部分。所以我不需要匹配 'orange''2''123'

我的问题:

  1. 我怎样才能打破那个循环?
  2. 还有其他更好的方法吗?

any()与生成器一起使用

filterList=['test','2','x','123','orange']
print ([i for i in datalist if any(j for j in filterList if j in i) ])

any 在找到第一个元素时停止迭代

Uri的回答是正确的,结果列表中最多有一个元素:

print [i for i in datalist if any(j for j in filterList if j in i) ]

['mytest123orange', '2 cup of tea']

如果没有找到匹配项,结果列表将为空。

结论是 any() 不会导致 'short-circuit',而是在应用 any() 之前整个发电机已耗尽。