2017-06-12 52 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