2017-06-12 2 views
0

2つのネストされたリストに15,000個のリストがあり、リストごとに5個の変数があります。私は、各サブリストから2つの変数を調べ、一致するものを探します。両方の変数に一致するものがある場合は何もしないでください。一致しない場合は、サブリストlagerProductの変数を0に設定し、lagerProductself.mainlistを追加する必要があります。最終出力はself.mainlistで、self.hovedfil +サブリストはすべてself.lagerfilです。作業コードは以下のとおりですが、それほど高速ではありません。どうすればスピードアップできますか?2つの長いネストされたリストの変数をチェックするときに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

あなたのコードの最終出力はどのようなものです。メインリスト '? – Nurjan

+0

@Nurzhan yea、self.mainlistにする必要があります – Louvre

+0

'self.lagerfil'に' self.mainlist'を割り当ててから、 'self.lagerfil'の要素を' mainlist'に追加するのはちょっと混乱します。また、コードに誤字があります。 – Nurjan

答えて

1

あなたの問題は、それが2.25億の反復であるmainlistで15000個の要素のそれぞれについて、あなたは(も、あなたは残りの要素をチェックし続けて試合を見つけた後)hovedFilで15000個の要素を反復処理することです。

また、self.mainlsitを繰り返していて、別の名前をリストに追加してもリストをコピーしないで追加するなどの問題があります。

あなたはset()にhovedFilを変換する必要があり、その後、検索は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

関連する問題