Encuentra elementos en una lista que no están en la otra [duplicado]

Resuelto CosimoCD asked hace 7 años • 10 respuestas

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_1y agregar main_listtodos los elementos list_2que no se encuentran en list_1.

El resultado debería ser:

main_list = ["f", "m"]

¿Cómo puedo hacerlo con Python?

CosimoCD avatar Dec 13 '16 23:12 CosimoCD
Aceptado

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']
nrlakin avatar Dec 13 '2016 16:12 nrlakin

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,, = ).array2assume_uniqueFalse

assume_uniquepregunta 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 array1que no están en array2. assume_uniquees Falsepor 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 setdiff1den 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_2no es único: list2 = ["a", "f", "c", "m", "m"]. Mantener list1como está: list_1 = ["a", "b", "c", "d", "e"]
establecer el valor predeterminado de assume_uniquerendimientos ["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_uniquesu valor predeterminado. Tenga en cuenta que ambas respuestas están ordenadas.

pitónengordado

JP Maulion avatar Dec 13 '2016 17:12 JP Maulion