检查两个长嵌套列表中的变量时加速for循环

时间:2017-06-12 12:17:17

标签: python-3.x python-3.6

我有两个嵌套列表,其中包含15000个列表,每个列表每个列表有5个变量。我检查每个子列表中的两个变量,以查找匹配项。如果两个变量都匹配,则不应执行任何操作,如果不匹配,则子列表lagerProduct中的变量应设置为0,lagerProduct应附加到self.mainlist。最终输出为self.mainlist,其中包含来自self.hovedfil的所有self.lagerfil +子列表。工作代码如下,但速度不是很快。我怎样才能加快速度呢?

match = False
self.lagerFil = self.mainlist #15000 sublists with 5 values in each sublist
self.hovedFil = [[]] #15000 sublists with 5 values in each sublist
for lagerProduct in self.lagerFil:
    for produktHoved in self.hovedFil:
        if lagerProduct[0] == produktHoved[0] and lagerProduct[3] == produktHoved[3]:
            match = True

    if match == False:
        lagerProduct [4] = 0
        self.mainlist.append(lagerProduct)
    else:
        match = False

1 个答案:

答案 0 :(得分:1)

您的问题是,对于主列表中的15000个元素中的每一个,您在hovedFil中迭代超过15000个元素(即使在找到匹配后继续检查其余元素),即2.25亿次迭代。

还有其他一些问题,例如你在self.mainlsit上迭代,同时还附加到它(只是为列表分配另一个名称不会复制列表)。

您应该将hovedFil转换为set()然后搜索变为O(1),并且应该使用匹配的产品构建单独的列表:

matches = set((p[0], p[3]) for p in self.hovedFil)
matchedProducts = [
    lagerProduct for lagerProduct in self.lagerFil
    if (lagerProduct[0], lagerProduct[3]) not in matches]