En Python, ¿cuál es la mejor manera de calcular la diferencia entre dos listas?
ejemplo
A = [1,2,3,4]
B = [2,5]
A - B = [1,3,4]
B - A = [5]
Úselo set
si no le importa el orden o la repetición de los artículos. Use las comprensiones de la lista si lo hace:
>>> def diff(first, second):
second = set(second)
return [item for item in first if item not in second]
>>> diff(A, B)
[1, 3, 4]
>>> diff(B, A)
[5]
>>>
set(b)
para asegurarse de que el algoritmo sea O (nlogn) en lugar de Theta (n ^ 2)set
a B es inofensivo, pero aplicarloA
y utilizar el resultado en lugar del originalA
no lo es.Si el orden no importa, simplemente puede calcular la diferencia establecida:
fuente
Puedes hacer un
y
fuente
Un trazador de líneas:
O:
fuente
Los ejemplos anteriores trivializaron el problema de calcular diferencias. Asumir que la ordenación o la desduplicación definitivamente hace que sea más fácil calcular la diferencia, pero si su comparación no puede permitirse esos supuestos, necesitará una implementación no trivial de un algoritmo diff. Ver difflib en la biblioteca estándar de python.
A - B = [[1, 3, 4]]
fuente
print
ha cambiado de un comando a una funciónreduce
,filter
ymap
ha sido declarado no pitónico. (Y creo que Guido puede estar en lo cierto , tampoco entiendo lo quereduce
hace.)Python 2.7.3 (predeterminado, 27 de febrero de 2014, 19:58:35) - IPython 1.1.0 - timeit: (github gist)
Resultados:
@ roman-bodnarchuk la función de comprensión de listas def diff (a, b) parece ser más rápida.
fuente
fuente
Desea utilizar un en
set
lugar de unlist
.fuente
En caso de que desee que la diferencia se profundice recursivamente en los elementos de su lista, he escrito un paquete para python: https://github.com/erasmose/deepdiff
Instalación
Instalar desde PyPi:
Si eres Python3, también necesitas instalar:
Ejemplo de uso
El mismo objeto vuelve vacío
El tipo de un artículo ha cambiado
El valor de un artículo ha cambiado
Artículo agregado y / o eliminado
Diferencia de cadena
Diferencia de cuerda 2
Cambio de tipo
Lista de diferencia
Enumere la diferencia 2: tenga en cuenta que NO toma en cuenta el orden
Lista que contiene el diccionario:
fuente
de la manera más simple,
use set (). diferencia (set ())
la respuesta es
set([1])
fuente
En el caso de una lista de diccionarios , la solución de comprensión de la lista completa funciona mientras la
set
solución aumentaCaso de prueba
fuente
Código simple que le da la diferencia con varios elementos si lo desea:
fuente
Al echar un vistazo a TimeComplexity of In-operator, en el peor de los casos funciona con O (n). Incluso para conjuntos.
Entonces, al comparar dos matrices, tendremos una TimeComplexity de O (n) en el mejor de los casos y O (n ^ 2) en el peor de los casos.
Una solución alternativa (pero desafortunadamente más compleja), que funciona con O (n) en el mejor y el peor de los casos, es esta:
p.ej
fuente