我有两个列表:列表message
和列表keyword
。列表message
如下所示:
message = ["my name is blabla",'x-men is a good movie','i deny that fact']
keyword = ['x-men','name is','psycho movie']
我想创建一个新列表,其中包含消息中存在的关键字。
newList = []
for message_index in message:
print(newList)
for keyword in keywords:
if search(r'\b{}\b'.format(keyword), message_index):
newList.append(keyword)
我的python代码在上面,问题是我的消息列表中的每个句子大约是100到150个单词,列表的长度是3000.每个关键字可能是一个或两个单词,列表的长度是12,000。
所以搜索需要很长时间,有没有更短的方法呢?
这个问题不同,因为两个列表中都有大量数据。
答案 0 :(得分:2)
内置any()
功能:
按简单事件搜索:
message = ["my name is blabla",'x-men is a good movie','i deny that fact']
keyword = ['x-men','name is','psycho movie']
result = [k for k in keyword if any(k in m for m in message)]
print(result)
输出:
['x-men', 'name is']
<强> ---------- 强>
如果您需要搜索 完全 字词:
import re
message = ["my name is blabla",'x-men is a good movie','i deny that fact']
keyword = ['x-men','name is','psycho movie']
result = [k for k in keyword if any(re.search(r'\b{}\b'.format(k), m) for m in message)]
答案 1 :(得分:1)
通过将列表message
加入分隔字符串,然后在该字符串中搜索每个关键字,您可以显着降低关键字搜索的复杂性:
>>> ms='\t'.join(message)
>>> [e for e in keyword if e in ms]
['x-men', 'name is']
同样的方法适用于具有相同优点的正则表达式:
>>> [e for e in keyword if re.search(r'\b'+e+r'\b', ms)]
这降低了从O(M*N)
到O(N)
...
答案 2 :(得分:0)
尝试使用嵌套列表理解
list = [key for key in keyword for word in message if key in word]