Die bestehenden Lösungen bieten alle entweder das eine oder das andere an:
- Schneller als O(n*m) Leistung.
- Reihenfolge der Eingabeliste beibehalten.
Aber bis jetzt hat keine der beiden Lösungen funktioniert. Wenn Sie beides wollen, versuchen Sie dies:
s = set(temp2)
temp3 = [x for x in temp1 if x not in s]
Leistungstest
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)
Ergebnisse:
4.34620224079 # ars' answer
4.2770634955 # This answer
30.7715615392 # matt b's answer
Die von mir vorgestellte Methode bewahrt nicht nur die Reihenfolge, sondern ist auch (etwas) schneller als die Subtraktion von Mengen, da keine unnötige Menge gebildet werden muss. Der Leistungsunterschied würde sich stärker bemerkbar machen, wenn die erste Liste wesentlich länger ist als die zweite und wenn das Hashing teuer ist. Hier ist ein zweiter Test, der dies demonstriert:
init = '''
temp1 = [str(i) for i in range(100000)]
temp2 = [str(i * 2) for i in range(50)]
'''
Ergebnisse:
11.3836875916 # ars' answer
3.63890368748 # this answer (3 times faster!)
37.7445402279 # matt b's answer