编程语言
首页 > 编程语言> > python – 快速搜索两个列表中的所有元素

python – 快速搜索两个列表中的所有元素

作者:互联网

假设我有两个大型列表,list_of_A_objects包含类A的对象,列表_of_B_objects包含B类对象.

他们都有字符串成员.

我希望能够搜索两个列表中的所有元素,如果A对象的字符串成员是B对象的字符串成员的子字符串,我希望它能够执行某些操作.

如果列表很小,我在下面得到的很好,但如果列表很大,可能需要很长时间.

有没有办法让这更快.我一直在考虑以某种方式使用字典,因为它们有快速查找但我无法弄明白.

这就是我到目前为止所拥有的.

class A:
    def __init__(self, x):
        self.string = x

class B:
    def __init__(self,x):
        self.string = x

list_of_A_objects = get_large_list_of_A_objects()

list_of_B_objects = get_large_list_of_B_objects() 


for A_object in list_of_A_objects:
    for B_Object in list_of_B_objects:
        if A_object.string in B_Object.string:
            do_something()

解决方法:

您可以做的一件事是从B对象创建一个字符串.构建它时,还要创建索引列表,以便知道较大字符串中每个字符串的索引.请参阅下面的代码.

请注意,我不是python程序员,所以你必须解释我的伪代码.

BStrings = ""
list_of_Indexes = new list of int
for B_object in list_of_B_objects
    list_of_Indexes.Add(length of BStrings)
    BStrings = BStrings + B_Object.string + newline

现在,您可以搜索每个A_object的BStrings字符串.如果找到该字符串,该函数将返回在字符串中找到它的位置的索引.然后,您可以二进制搜索list_of_indexes以确定哪个B_object包含该字符串.

这并没有真正改变操作的复杂性(它仍然是MxN,其中M是A列表中的对象数,N是B列表的长度),但是搜索单个字符串中的子字符串将比循环遍历B列表,因为它避免了设置搜索的开销.

如果即使这样太慢,那么你也会想要使用像Aho-Corasick string matching algorithm这样的东西.可能有一个不错的Python实现.

标签:python,algorithm,computer-science,search,performance
来源: https://codeday.me/bug/20190703/1362224.html