Como alternativa, también puede usar filter
con la expresión lambda para obtener el resultado deseado. Por ejemplo:
>>> l1 = [1,2,6,8]
>>> l2 = set([2,3,5,8])
# v `filter` returns the a iterator object. Here I'm type-casting
# v it to `list` in order to display the resultant value
>>> list(filter(lambda x: x not in l2, l1))
[1, 6]
Comparación de rendimiento
Aquí estoy comparando el rendimiento de todas las respuestas mencionadas aquí. Como se esperaba, la set
operación basada en Arkku es más rápida.
Diferencia establecida de Arkku - Primero (0.124 usec por ciclo)
mquadri$ python -m timeit -s "l1 = set([1,2,6,8]); l2 = set([2,3,5,8]);" "l1 - l2"
10000000 loops, best of 3: 0.124 usec per loop
Lista Comprensión de Daniel Pryden con set
búsqueda - Segundo (0.302 usec por ciclo)
mquadri$ python -m timeit -s "l1 = [1,2,6,8]; l2 = set([2,3,5,8]);" "[x for x in l1 if x not in l2]"
1000000 loops, best of 3: 0.302 usec per loop
Lista de donas Comprensión en lista simple - Tercero (0.552 usec por ciclo)
mquadri$ python -m timeit -s "l1 = [1,2,6,8]; l2 = [2,3,5,8];" "[x for x in l1 if x not in l2]"
1000000 loops, best of 3: 0.552 usec per loop
Moinuddin Quadri's usandofilter
- Cuarto (0.972 usec por ciclo)
mquadri$ python -m timeit -s "l1 = [1,2,6,8]; l2 = set([2,3,5,8]);" "filter(lambda x: x not in l2, l1)"
1000000 loops, best of 3: 0.972 usec per loop
Akshay Hazari está usando la combinación de reduce
+filter
- Quinto (3.97 usec por ciclo)
mquadri$ python -m timeit "l1 = [1,2,6,8]; l2 = [2,3,5,8];" "reduce(lambda x,y : filter(lambda z: z!=y,x) ,l1,l2)"
100000 loops, best of 3: 3.97 usec per loop
PD: set
no mantiene el orden y elimina los elementos duplicados de la lista. Por lo tanto, no use la diferencia establecida si necesita alguno de estos.