2010-11-26 7 views
4
first = [(1, text, text, 1, 2, 3), 
     (1, text, text, 1, 0, 3), ... (6054, text, text, 2, 2, 3)] 
second = (1, 2, 3, 4, 5 ... 5412) 

Y at-il un moyen plus rapide de le faire:Optimisation

data = [x for x in first if x[0] in second] 
+0

Son pas du tout clair ce que vous essayez de faire. De ce que je peux voir tous les éléments en premier seront sélectionnés – Falmarri

+0

@Falmarri - édité pour rendre les choses plus claires. – Sam

Répondre

5

Essayez ceci:

first = [(1, text, text, 1, 2, 3), 
     (1, text, text, 1, 0, 3), ... (1054, text, text, 2, 2, 3)] 
second = (1, 2, 3, 4, 5 ... 5412) 
second_set = set(second) 
data = [x for x in first if x[0] in second_set] 

Supposons d'abord a des éléments m et le second a n éléments.

Les jeux sont hachés, donc leur recherche est proche de O (1) donnant une efficacité globale de O (m). La recherche en second sous forme de liste donne O (n) donnant une efficacité globale de O (m * n).

+0

Wow, merci! La vitesse d'exécution est vraiment évidente ... – Sam

1

Peut-être que vous voulez ce lieu du in chèque:

data = [x for x in first if 1 <= x[0] <= 5412 ] 
+0

Merci. Mais la réponse de Jason Baker est ce que je cherchais. (J'ai utilisé un exemple très simple dans ma question mais que se passe-t-il si la deuxième liste a d'autres types de données?) – Sam