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”.