2013-08-06 76 views
1

我遍歷包含〜500.000個子列表的10-20個長列表的集合。名單看起來像:迭代長列表的集合

A = [['a', 'b', 1.7], ['d', 'e', 6.2] ...] 
B = [['a', 'b', 2.0], ['d', 'e', 10.0] ...] 
C = [['a', 'b', 3.0], ['d', 'e',7.0] ...] 

等等... 我的目標是在年底爲下列之一來獲取一個列表:

final = [['a', 'b', 1.7, 2.0, 3.0], ['d', 'e', 6.2, 6.2, 10.0, 7.0] ...] 

我已經通過比較已經使用嵌套循環模板列表(例如A),其所有的列表值的列表(總):

total =[['a', 'b', 1.7], ['d', 'e', 6.2], ['a', 'b', 2.0], ['d', 'e', 10.0], ['a', 'b', 3.0], ['d', 'e',7.0]] 

temp = [] 
for i in A: 
    new = [i[0:1]] 
    for j in total: 
     if i[0] == j[0]: 
      new.append(j[2]) 
    temp.append(new) 

我得到的東西接近我所期待的,除了初始的字符串包含一個subli內ST。但是稍後這很容易解決。這種方法的問題是,考慮到列表的大小,整個過程需要大量的時間。任何替代建議或提示,以縮短這一過程,將不勝感激。

+1

是'6.2'應該有兩次? – user2357112

+0

不,它應該只有一個。我錯誤地輸入了兩次。 – user2658190

回答

3

一個字典將在這裏更合適,因爲它可以讓您訪問與O(1)時間的任何鍵相關的值。

使用collections.defaultdict

>>> from collections import defaultdict 
>>> total =[['a', 'b', 1.7], ['d', 'e', 6.2], ['a', 'b', 2.0], ['d', 'e', 10.0], ['a', 'b', 3.0], ['d', 'e',7.0]] 
>>> dic = defaultdict(list) 
>>> for item in total: 
     key = tuple(item[:2]) #tuples can be used as dictionary keys 
     val = item[2] 
     dic[key].append(val) 
...  
>>> dic 
defaultdict(<type 'list'>, 
{('a', 'b'): [1.7, 2.0, 3.0], 
('d', 'e'): [6.2, 10.0, 7.0]}) 

使用正常dict

>>> dic = {} 
>>> for item in total: 
     key = tuple(item[:2]) #tuples can be used as dictionary keys 
     val = item[2] 
     dic.setdefault(key, []).append(val) 
...  
>>> dic 
{('a', 'b'): [1.7, 2.0, 3.0], ('d', 'e'): [6.2, 10.0, 7.0]}