2015-09-23 41 views
-1

我有兩個庫和列表如下蟒巨大的字典比較

list1 =[['3', {'3': ['4'], '10': ['2'], '9': ['8'], '11': ['8']}], 
    ['8', {'7': ['8'], '6': ['9'], '3': ['1']}], 
    ['7', {'5': ['11'], '10': ['6'], '2': ['3']}], 
    ['9', {'4': ['1']}] 
    ] 
list2 ={0: -2.829363315837061, 1: -3.483150971596311, 2: -3.55866903680906, 3: -3.644673448138691, 4: -3.78, 5: -3.9343704669124677, 6: -4.1158785480167435, 7: -4.074895059134982, 8: -4.397225116848732, 9: -4.425674125747298, 10: -4.416164011466592, 11: -4.906491662382141} 

list3 ={0: -2.865996006819783, 1: -3.6503055799900492, 2: -3.58670223884185, 3: -3.73129019873609, 4: -3.73, 5: -4.049442571308586, 6: -4.086222130931718, 7: -4.19022476024935, 8: -4.243919389901362, 9: -4.246976004644184, 10: -4.334028831306514, 11: -4.678255063114617} 

我想獲得與基於列表1鍵從兩個字典的鍵(列表2和項目list3)關聯的值如果密鑰相同,然後將與列表1具有相同密鑰的列表2的值與列表1的值相乘,並將這些值與列表3的列表1中的每個列表相加。

for index in range(len(list1)): 
tot_pos_probability = 0 
tot_neg_probability =0 
    for the_key, the_value in list1[index][1].items(): 
     for item in list2.keys(): 
      if int(the_key) == item: 
       tot_pos_probability += int(the_value[0])*list2.get(item) 
     for elem in list3.keys(): 
      if int(the_key) == elem: 
       tot_neg_probability += int(the_value[0])*list3.get(elem) 

上面的代碼工作完全正常,給我的結果如預期的上述列表和字典的例子。

但我的原始list1大小約爲15000,list1中的每個字典包含大約200-400個鍵值對。類似地,兩個字典list2和list3也包含大約10000個唯一鍵值對。上面的代碼工作起來很差這種情況下,我無法得到任何結果。它保持運行10分鐘,沒有結果。請你幫我一個優化的解決方案,在這種情況下真的很好。

回答

0

你不需要內for循環,在那些你只是檢查是否the_key在列表2或list3一個鍵,然後用你的公式計算tot_pos_probabilitytot_neg_probability。您可以改用.get()0一個默認值,因此,如果key不存在,它不會改變的可能性。示例 -

for list1elem in list1: 
    tot_pos_probability = 0 
    tot_neg_probability =0 
    for the_key, the_value in list1elem[1].items(): 
     tot_pos_probability += int(the_value[0])*list2.get(int(the_key), 0) 
     tot_neg_probability += int(the_value[0])*list3.get(int(the_key), 0) 
+0

它給出的值爲0 – krish

+0

哦,等待,忘了投射到int,現在嘗試。 –

0

我發現使用以下方法可以顯着提高性能。它可能會幫助你:)

 for each in list1: 
      mykeys = each[1].keys() 
      mylist = map(int,mykeys) 
      common1 = set(mylist) & set(list2) 
      common2 = set(mylist) & set(list3) 
      if common1: 
       tot_pos_probability = map(lambda ele: int(each[1][str(ele)][0])*list2[ele], common1) 
       print sum(tot_pos_probability) 
      if common2: 
       tot_neg_probability = map(lambda ele: int(each[1][str(ele)][0])*list2[ele], common2) 
       print sum(tot_neg_probability)