在python中搜索大型列表

时间:2017-11-01 13:05:55

标签: python search substring data-processing

我有两个列表:列表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。

所以搜索需要很长时间,有没有更短的方法呢?

这个问题不同,因为两个列表中都有大量数据。

3 个答案:

答案 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]