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)
4 Réponses :
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)
Intéressant, SET (LIST1) .Insection (List2) CODE> est plus rapide que
SET (LIST1) & SET (LIST2) CODE>, je suppose que c'est parce que la création de deux ensembles est plus chère que le chargement et l'appelant
.Intersection () code> hmm ..
@mouad sur ma machine, SET (LIST1) & SET (List2) CODE> est plus rapide que d'utiliser
.Insection () code>. 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.
Votre solution a une complexité de dans les cas où la vitesse importe plus que la lisibilité (c'est-à-dire , presque jamais), vous pouvez également utiliser p> qui correspond à environ 20% plus rapide que les autres solutions sur ma machine. P> P> O (m * n) code>, où
m code> et
n code> sont les longueurs respectives des deux listes. Vous pouvez améliorer la complexité à
o (m + n) code> à l'aide d'un ensemble pour l'une des listes:
Pour le cas des listes, le moyen le plus efficace est d'utiliser: comme mentionné, mais pour les tableaux numpus, surtout, lorsque vous savez que les listes ne disposent pas de valeurs dupliquées, vous pouvez l'utiliser comme: p> intersection1d code> fonction est plus efficace:
result = np.intersection1d(list1, list2, assume_unique=True)
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)