10
votes

Efficacité de l'intersection de la liste Python: générateur ou filtre ()?

Je voudrais intersecter deux listes dans Python (2.7). J'ai besoin du résultat pour être iTérable:

result = filter(lambda x: x in list2, list1)


0 commentaires

4 Réponses :


24
votes

aucun de ces personnes. Le meilleur moyen est d'utiliser des ensembles.

list1 = [1,2,3,4]
list2 = [3,4,5,6]
result = set(list1).intersection(list2)


4 commentaires

Intéressant, SET (LIST1) .Insection (List2) est plus rapide que SET (LIST1) & SET (LIST2) , je suppose que c'est parce que la création de deux ensembles est plus chère que le chargement et l'appelant .Intersection () hmm ..


@mouad sur ma machine, SET (LIST1) & SET (List2) est plus rapide que d'utiliser .Insection () . Mais la différence n'est pas très importante.


Cela nécessite-t-il que les listes soient triées?


@ YOUDA008 Les listes n'ont pas besoin d'être triées. Les ensembles sont mis en œuvre par hachage, de sorte que la recherche se produit dans l'amortissement O (1) heure indépendamment de l'emplacement dans la liste d'origine.



8
votes

Votre solution a une complexité de O (m * n) , où m et n sont les longueurs respectives des deux listes. Vous pouvez améliorer la complexité à o (m + n) à l'aide d'un ensemble pour l'une des listes: xxx

dans les cas où la vitesse importe plus que la lisibilité (c'est-à-dire , presque jamais), vous pouvez également utiliser xxx

qui correspond à environ 20% plus rapide que les autres solutions sur ma machine.


0 commentaires

1
votes

Pour le cas des listes, le moyen le plus efficace est d'utiliser: xxx pré>

comme mentionné, mais pour les tableaux numpus, intersection1d code> fonction est plus efficace: xxx pré>

surtout, lorsque vous savez que les listes ne disposent pas de valeurs dupliquées, vous pouvez l'utiliser comme: p>

result = np.intersection1d(list1, list2, assume_unique=True)


0 commentaires

4
votes

J'ai essayé de comparer la vitesse de 3 méthodes d'intersection de la liste:

start = time.time()
for _ in range(1000):
    result = np.intersect1d(a, b)
elapse = time.time() - start
print(elapse) 


0 commentaires