2010-03-18 6 views
1

Je veux obtenir l'union de 2 listes imbriquées plus un index aux valeurs communes.union python de 2 listes imbriquées avec index

J'ai deux listes comme A = [[1,2,3],[4,5,6],[7,8,9]] et B = [[1,2,3,4],[3,3,5,7]] mais la longueur de chaque liste est d'environ 100 000 à A appartient un vecteur d'index avec len(A): I = [2,3,4]

Ce que je veux est de trouver tous les sous-listes en B où le premier 3 éléments sont égal à une sous-liste dans A. Dans cet exemple, je veux obtenir B[0] retourné ([1,2,3,4]) parce que ses trois premiers éléments sont égaux à A[0]. En outre, je veux également l'index à A[0] dans cet exemple, c'est I[0].

J'ai essayé différentes choses, mais rien ne fonctionnait jusqu'à présent :(

D'abord j'ai essayé ceci:

Common = [] 

for i in range(len(B)): 

    if B[i][:3] in A: 

     id = [I[x] for x,y in enumerate(A) if y == B[i][:3]][0] 
     ctdCommon.append([int(id)] + B[i]) 

Mais cela prend une éternité, ou ne se termine jamais

Je transformé A et B en ensembles et a pris l'union des deux, ce qui était très rapide, mais je ne sais pas comment obtenir les indices correspondants

Est-ce que quelqu'un a une idée?

Répondre

1

Créer un dict auxiliaire (travail est O(len(A)) - en supposant que les trois premiers éléments d'une sous-liste dans une identification unique (sinon vous avez besoin d'un dict de listes):

aud = dict((tuple(a[:3]), i) for i, a in enumerate(A)) 

Utilisez dit dict en boucle une fois sur B (travail O(len(B))) pour obtenir B et indices des sous-listes a:

result = [(b, aud[tuple(b[:3])]) for b in B if tuple(b[:3]) in aud] 
+0

bien fait pour travailler sur assez de ce qui est demandé de produire une réponse. Mon cerveau me fait mal en essayant de comprendre ce qu'il veut. – MattH

+0

Cela a fonctionné et superquick! Merci beaucoup! – sbas

Questions connexes