2017-06-12 33 views
0

我有两个嵌套列表,每个列表包含15000个列表,每个列表包含5个变量。我从每个子列表中检查两个变量来查找匹配。如果两个变量都匹配,则不应该做任何事情,如果没有匹配,则应将子列表lagerProduct中的变量设置为0,并将lagerProduct附加到self.mainlist。最终的输出是self.mainlist,其中 + self.lagerfil的子列表全部为self.lagerfil。工作代码在下面,但不是很快。我如何加快速度?当检查两个长嵌套列表中的变量时加快for循环

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 
+0

什么是你的代码的最终输出 - '自我。 mainlist'? – Nurjan

+0

@Nurzhan yea,应该是self.mainlist – Louvre

+0

你已经将'self.mainlist'赋给'self.lagerfil',然后将'self.lagerfil'中的元素添加到'mainlist',这有点令人困惑。你的代码中也有错别字。 – Nurjan

回答

1

你的问题是,对于每一个在mainlist 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] 
+0

感谢您的回答!我不知道list2 = list1没有做一个副本,而且似乎通过使用list2 = list(list1)事情加快了很多,因为我不必迭代附加值:)我将self.mainlist分配给新的原因变量是为了避免迭代附加值。我会研究你的答案的其余部分,并尝试学习新的东西。再次感谢! – Louvre