¿Existe una forma rápida de comprobar si un conjunto contiene por completo otro?
Algo como:
>>>[1, 2, 3].containsAll([2, 1])
True
>>>[1, 2, 3].containsAll([3, 5, 9])
False
Esas son listas, pero si realmente te refieres a conjuntos, puedes usar el método issubset.
>>> s = set([1,2,3])
>>> t = set([1,2])
>>> t.issubset(s)
True
>>> s.issuperset(t)
True
Para obtener una lista, no podrá hacer nada mejor que marcar cada elemento.
issubset()
no escontains()
Para completar: esto es equivalente a
issubset
(aunque posiblemente un poco menos explícito / legible):>>> set([1,2,3]) >= set([2,1]) True >>> set([1,2,3]) >= set([3,5,9]) False
fuente
Una opción queda intacta: la resta:
>>> {1, 2} - {1, 2, 3} set([]) >>> {1, 2, 3} - {1, 2} set([3])
Básicamente, verifica qué elementos de la primera lista no están en la segunda.
Lo encontré muy útil ya que podía mostrar qué valores faltan:
>>> def check_contains(a, b): ... diff = a - b ... if not diff: ... # All elements from a are present in b ... return True ... print('Some elements are missing: {}'.format(diff)) ... return False ... >>> check_contains({1, 2}, {1, 2, 3}) True >>> check_contains({1, 2, 3}, {1, 2}) Some elements are missing: set([3]) False
fuente
Puede utilizar
set.issubset()
oset.issuperset()
(o sus contrapartes basadas en el operador:<=
y>=
). Tenga en cuenta que los métodos aceptarán cualquier iterable como argumento, no solo un conjunto:>>> {1, 2}.issubset([1, 2, 3]) True >>> {1, 2, 3}.issuperset([1, 2]) True
Sin embargo, si usa operadores, ambos argumentos deben establecerse:
>>> {1, 2} <= {1, 2, 3} True >>> {1, 2, 3} >= {1, 2} True
fuente
Si sospecha que un conjunto es un subconjunto de otro e interseca esos dos conjuntos, el resultado es igual a sí mismo si es un subconjunto.
a = [2,1,3,3] b = [5,4,3,2,1] set(a).intersection(set(b)) == set(a) >>True
fuente
A = set(a)
yB = set(b)
por la cordura. Entonces esta comparación es eficientemente reducible alen(A.intersection(B)) == len(A)
. Es decir, los conjuntos en sí mismos no necesitan compararse por elementos; sólo es necesario comparar la cardinalidad de estos conjuntos. Sin embargo, incluso esta optimización es probablemente insuficiente para hacer que este enfoque sea preferible. Los enfoques y dramáticamente más legibles y eficientes son casi con certeza lo que todos quieren.issubset()
<=
>>> set([1,2,3]).issuperset(set([2,1])) True >>> >>> set([1,2,3]).issuperset(set([3,5,9])) False
fuente
Debajo de la función, devuelva 0 si la lista principal no contiene la sublista completamente y 1 si la contiene completamente.
def islistsubset(sublist,mainlist): for item in sublist: if item in mainlist: contains = 1 else: contains = 0 break; return contains
fuente
any(item in mainlist for item in sublist)
.