Saltar al contenido

¿Cómo comprobar si todos los elementos de una lista están en otra lista?

Solución:

Cuando el número de ocurrencias no importa, aún puede usar la funcionalidad de subconjunto, creando un conjunto sobre la marcha:

>>> list1 = ['a', 'c', 'c']
>>> list2 = ['x', 'b', 'a', 'x', 'c', 'y', 'c']
>>> set(list1).issubset(list2)
True

Si necesita verificar si cada elemento aparece al menos tantas veces en la segunda lista como en la primera lista, puede hacer uso del tipo Contador y definir su propia relación de subconjunto:

>>> from collections import Counter
>>> def counterSubset(list1, list2):
        c1, c2 = Counter(list1), Counter(list2)
        for k, n in c1.items():
            if n > c2[k]:
                return False
        return True
   
>>> counterSubset(list1, list2)
True
>>> counterSubset(list1 + ['a'], list2)
False
>>> counterSubset(list1 + ['z'], list2)
False

Si ya tiene contadores (que podría ser una alternativa útil para almacenar sus datos de todos modos), también puede escribir esto como una sola línea:

>>> all(n <= c2[k] for k, n in c1.items())
True

Tenga en cuenta lo siguiente:

>>>listA = ['a', 'a', 'b','b','b','c']
>>>listB = ['b', 'a','a','b','c','d']
>>>all(item in listB for item in listA)
True

Si lee la línea “all” como lo haría en inglés, esto no es incorrecto pero puede ser engañoso, ya que listA tiene una tercera ‘b’ pero listB no.

Esto también tiene el mismo problema:

def list1InList2(list1, list2):
    for item in list1:
        if item not in list2:
            return False
    return True

Solo una nota. Lo siguiente no funciona:

>>>tupA = (1,2,3,4,5,6,7,8,9)
>>>tupB = (1,2,3,4,5,6,6,7,8,9)
>>>set(tupA) < set(TupB)
False

Si convierte las tuplas en listas, todavía no funciona. No sé por qué funcionan las cadenas, pero las ints no.

Funciona, pero tiene el mismo problema de no llevar el recuento de ocurrencias de elementos:

>>>set(tupA).issubset(set(tupB))
True

El uso de conjuntos no es una solución integral para la coincidencia de elementos de múltiples ocurrencias.

Pero aquí hay una solución / adaptación de una sola línea a la respuesta de shantanoo sin try / except:

all(True if sequenceA.count(item) <= sequenceB.count(item) else False for item in sequenceA)

Una función incorporada que envuelve una lista de comprensión mediante un operador condicional ternario. ¡Python es asombroso! Tenga en cuenta que “<=" no debe ser "==".

Con esta solución, la secuencia A y B pueden ser de tipo tupla y lista y otras “secuencias” con métodos de “recuento”. Los elementos de ambas secuencias pueden ser de la mayoría de los tipos. No usaría esto con dictados como está ahora, de ahí el uso de “secuencia” en lugar de “iterable”.

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


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

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