2013-11-27 162 views
0

此代碼按預期方式工作,但佔用大量內存,並且比我的代碼的任何其他部分運行時間要長得多。Python嵌套循環比較兩個列表並更新字典

def function(input1, input2): 
    mapping = [] 
    for item in input1: 
     risks = {"A":0, "B":0, "C":0, "D":0, "E":0} 
     temp = [] 
     for row in input2: 
      if item in row[0]: 
       for key in risks.keys(): 
        if row[1] == key: 
         risks[key] += 1 
     temp.append(item) 
     for key in risks.keys(): 
      temp.append(risks[key]) 
     mapping.append(temp) 
    return mapping 

我希望找到一個更有效的方法來做到這一點,並且內存少得多。 input1是唯一字符串列表,input2是不唯一的元組列表。有一個更好的方法來做到這一點。

感謝您的幫助。

+4

你能解釋一下(字),你的作用是什麼是應該做的? – mgilson

+0

或提供某種示例輸入和輸出... – tamasgal

回答

0

首先是一些測試數據:

import random 

input1 = list(range(1000)) 
input2 = [ 
    ([random.randint(0, 1000) for _ in range(100)], random.choice("ABCDE")) 
    for _ in range(10000) 
] 

然後我的新功能:

def newfunction(input1, input2): 
    input1_map = {i: dict.fromkeys("ABCDE", 0) for i in input1} 

    for row in input2: 
     for i1 in set(row[0]): 
      try: 
       input1_map[i1][row[1]] += 1 
      except KeyError: 
       pass 

    return [[i] + list(input1_map[i].values()) for i in input1] 

這是深度爲2,而不是3,所以最終被快很多關於大投入。

  1. 如果row[0]不包含重複,改變set(row[0])只是row[0]
  2. 如果try不應該失敗,請將其刪除。
  3. 選擇更好的變量名稱。我不知道代表什麼,所以我的名字很糟糕。
  4. 如果速度太過關注,最後一個陳述可能會被微觀優化,但我不認爲這很重要。
  5. list(input1_map[i].values())是非確定性的。考慮一下。

僅供參考,這裏的舊版本:

def function(input1, input2): 
    mapping = [] 
    for item in input1: 
     risks = {"A":0, "B":0, "C":0, "D":0, "E":0} 
     temp = [] 
     for row in input2: 
      if item in row[0]: 
       for key in risks.keys(): 
        if row[1] == key: 
         risks[key] += 1 
     temp.append(item) 
     for key in risks.keys(): 
      temp.append(risks[key]) 
     mapping.append(temp) 
    return mapping 

並把它傳遞我的測試:

function(input1, input2) == newfunction(input1, input2) 
#>>> True