Les solutions existantes offrent tous un ou l'autre de:
- Plus rapide que O(n*m) de la performance.
- Préserver l'ordre de la liste d'entrée.
Mais jusqu'à présent, aucune solution n'a la fois. Si vous souhaitez à la fois, essayez ceci:
s = set(temp2)
temp3 = [x for x in temp1 if x not in s]
Test de Performance
import timeit
init = 'temp1 = list(range(100)); temp2 = [i * 2 for i in range(50)]'
print timeit.timeit('list(set(temp1) - set(temp2))', init, number = 100000)
print timeit.timeit('s = set(temp2);[x for x in temp1 if x not in s]', init, number = 100000)
print timeit.timeit('[item for item in temp1 if item not in temp2]', init, number = 100000)
Résultats:
4.34620224079 # ars' answer
4.2770634955 # This answer
30.7715615392 # matt b's answer
La méthode que j'ai présenté ainsi que le maintien de l'ordre est aussi (un peu) plus vite que l'ensemble de la soustraction car elle ne nécessite pas la construction d'une inutiles ensemble. La différence de performances serait plus perceptible si la première liste est beaucoup plus longue que la deuxième, et si le hachage est cher. Voici un deuxième test de le démontrer:
init = '''
temp1 = [str(i) for i in range(100000)]
temp2 = [str(i * 2) for i in range(50)]
'''
Résultats:
11.3836875916 # ars' answer
3.63890368748 # this answer (3 times faster!)
37.7445402279 # matt b's answer