Encuentra elementos en una lista que no están en la otra [duplicado]
Necesito comparar dos listas para crear una nueva lista de elementos específicos que se encuentran en una lista pero no en la otra. Por ejemplo:
main_list = []
list_1 = ["a", "b", "c", "d", "e"]
list_2 = ["a", "f", "c", "m"]
Quiero recorrer list_1
y agregar main_list
todos los elementos list_2
que no se encuentran en list_1
.
El resultado debería ser:
main_list = ["f", "m"]
¿Cómo puedo hacerlo con Python?
Puedes usar conjuntos:
main_list = list(set(list_2) - set(list_1))
Producción:
>>> list_1=["a", "b", "c", "d", "e"]
>>> list_2=["a", "f", "c", "m"]
>>> set(list_2) - set(list_1)
set(['m', 'f'])
>>> list(set(list_2) - set(list_1))
['m', 'f']
Según el comentario de @JonClements, aquí hay una versión más ordenada:
>>> list_1=["a", "b", "c", "d", "e"]
>>> list_2=["a", "f", "c", "m"]
>>> list(set(list_2).difference(list_1))
['m', 'f']
TL;DR:
SOLUCIÓN (1)
import numpy as np
main_list = np.setdiff1d(list_2,list_1)
# yields the elements in `list_2` that are NOT in `list_1`
SOLUCIÓN (2) Quieres una lista ordenada
def setdiff_sorted(array1,array2,assume_unique=False):
ans = np.setdiff1d(array1,array2,assume_unique).tolist()
if assume_unique:
return sorted(ans)
return ans
main_list = setdiff_sorted(list_2,list_1)
EXPLICACIONES: (
1) Puede utilizar NumPy setdiff1d
( array1
,, = ).array2
assume_unique
False
assume_unique
pregunta al usuario SI los arrays YA SON ÚNICOS.
Si False
, entonces los elementos únicos se determinan primero.
Si es True
, la función asumirá que los elementos ya son únicos Y la función omitirá la determinación de los elementos únicos.
Esto produce los valores únicos en array1
que no están en array2
. assume_unique
es False
por defecto.
Si le preocupan los elementos únicos (según la respuesta de Chinny84 ), simplemente use (donde assume_unique=False
=> el valor predeterminado):
import numpy as np
list_1 = ["a", "b", "c", "d", "e"]
list_2 = ["a", "f", "c", "m"]
main_list = np.setdiff1d(list_2,list_1)
# yields the elements in `list_2` that are NOT in `list_1`
(2)
Para aquellos que quieran ordenar las respuestas, he creado una función personalizada:
import numpy as np
def setdiff_sorted(array1,array2,assume_unique=False):
ans = np.setdiff1d(array1,array2,assume_unique).tolist()
if assume_unique:
return sorted(ans)
return ans
Para obtener la respuesta, ejecute:
main_list = setdiff_sorted(list_2,list_1)
NOTAS LATERALES:
(a) La solución 2 (función personalizada setdiff_sorted
) devuelve una lista (en comparación con una matriz en la solución 1).
(b) Si no está seguro de si los elementos son únicos, simplemente use la configuración predeterminada de NumPy setdiff1d
en las soluciones A y B. ¿Cuál puede ser un ejemplo de complicación? Ver nota (c).
(c) Las cosas serán diferentes si alguna de las dos listas no es única.
Decir list_2
no es único: list2 = ["a", "f", "c", "m", "m"]
. Mantener list1
como está: list_1 = ["a", "b", "c", "d", "e"]
establecer el valor predeterminado de assume_unique
rendimientos ["f", "m"]
(en ambas soluciones). SIN EMBARGO, si configura assume_unique=True
, ambas soluciones dan ["f", "m", "m"]
. ¿Por qué? Esto se debe a que el usuario ASUMIÓ que los elementos son únicos). Por lo tanto, ES MEJOR MANTENER assume_unique
su valor predeterminado. Tenga en cuenta que ambas respuestas están ordenadas.
pitónengordado