打破内部列表理解
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'
。
我的问题:
- 我怎样才能打破那个循环?
- 还有其他更好的方法吗?
将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()
之前整个发电机已耗尽。
我有数据列表和过滤器列表,我想使用列表理解方法来搜索数据列表中的任何项目,其字符串包含过滤器列表中的任何单词:
>>> 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'
。
我的问题:
- 我怎样才能打破那个循环?
- 还有其他更好的方法吗?
将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()
之前整个发电机已耗尽。