Saltar al contenido

Python encuentra elementos en una lista que no están en la otra

Contamos con el hallazgo a este enigma, al menos eso pensamos. Si sigues con preguntas puedes escribirlo en el apartado de preguntas, para nosotros será un gusto responderte

Solución:

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;RD:
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) Puedes usar NumPy setdiff1d (array1,array2,assume_unique=False).

assume_unique pregunta al usuario SI las matrices YA SON ÚNICAS.
Si Falseentonces los elementos únicos se determinan primero.
Si Truela 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 ese no son en array2. assume_unique es False por defecto.

Si le preocupa el único elementos (basado en la respuesta de Chinny84), luego 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 quieren 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 SECUNDARIAS:

(a) Solución 2 (función personalizada setdiff_sorted) devuelve un lista (en comparación con un array 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 ambas soluciones A y B. ¿Cuál puede ser un ejemplo de una complicación? Ver nota (c).

(c) Las cosas serán diferentes si cualquiera de las dos listas es no único.

Decir list_2 no es único: list2 = ["a", "f", "c", "m", "m"]. Mantenerse list1 como es: list_1 = ["a", "b", "c", "d", "e"]
Configuración del valor predeterminado de assume_unique rendimientos ["f", "m"] (en ambas soluciones). SIN EMBARGO, si configura assume_unique=Trueambas 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 a su valor predeterminado. Tenga en cuenta que ambas respuestas están ordenadas.

pythonnumpy

No estoy seguro de por qué las explicaciones anteriores son tan complicadas cuando tiene métodos nativos disponibles:

main_list = list(set(list_2)-set(list_1))

Aquí puedes ver las reseñas y valoraciones de los usuarios

Si eres capaz, tienes la libertad de dejar una noticia acerca de qué te ha impresionado de esta sección.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *