2013-08-06 4 views
1

Je parcours une liste de 10 à 20 longues listes contenant environ 500 000 sous-listes. Les listes ressemblent:Itération sur la collecte de longues listes

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] ...] 

et ainsi de suite ... Mon objectif est d'obtenir une liste à la fin comme la suivante:

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

Je l'ai déjà utilisé des boucles imbriquées en comparant une liste des modèles (par exemple a) avec une liste contenant toutes les listes de valeurs (total):

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) 

je reçois quelque chose à ce que je cherche, sauf que les chaînes initiales sont inclus dans un Subli st. Mais ce serait facile de travailler plus tard. Le problème avec cette approche est que compte tenu de la taille des listes, les processus complets prennent énormément de temps. Toute autre suggestion ou conseil pour raccourcir cette procédure serait appréciée.

+1

est '6.2' censé être là deux fois? – user2357112

+0

Non, ce ne devrait être qu'une seule. Je tapé deux fois par erreur. – user2658190

Répondre

3

Un dict serait plus approprié ici que ça va vous permettre d'accéder à des valeurs liées à une touche dans O(1) temps.

En utilisant 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]}) 

En utilisant dict normal:

>>> 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]} 
Questions connexes