Existe-t-il un moyen rapide de vérifier si un ensemble en contient un autre?
Quelque chose comme:
>>>[1, 2, 3].containsAll([2, 1])
True
>>>[1, 2, 3].containsAll([3, 5, 9])
False
Ce sont des listes, mais si vous voulez dire vraiment des ensembles, vous pouvez utiliser la méthode issubset.
>>> s = set([1,2,3])
>>> t = set([1,2])
>>> t.issubset(s)
True
>>> s.issuperset(t)
True
Pour une liste, vous ne pourrez pas faire mieux que de vérifier chaque élément.
Pour être complet, cela équivaut à issubset
(même s’il est un peu moins explicite/lisible)
>>> set([1,2,3]) >= set([2,1])
True
>>> set([1,2,3]) >= set([3,5,9])
False
Peut-être excessif, mais une autre variante:.
En d'autres termes: Si la cardinalité d'un ensemble en question est égale à la cardinalité résultante de son ensemble coupé d'un autre ensemble, il s'agit alors d'un sous-ensemble de cet ensemble.
a = [2,1,3,3]
b = [5,4,3,2,1]
set(a).intersection(set(b)) == set(a)
>>True
Une option est laissée intacte - soustraction:
>>> {1, 2} - {1, 2, 3}
set([])
>>> {1, 2, 3} - {1, 2}
set([3])
Fondamentalement, vous vérifiez quels éléments de la première liste ne sont pas dans la deuxième liste.
Je l’ai trouvé très pratique car vous pouvez montrer quelles valeurs manquent:
>>> 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
La fonction ci-dessous renvoie 0 si la liste principale ne contient pas la sous-liste et 1 si elle est entièrement.
def islistsubset(sublist,mainlist):
for item in sublist:
if item in mainlist:
contains = 1
else:
contains = 0
break;
return contains
Vous pouvez utiliser soit set.issubset()
ou set.issuperset()
(ou leurs homologues basés sur l'opérateur: <=
et >=
). Notez que les méthodes accepteront any iterable en tant qu'argument, pas simplement un ensemble:
>>> set([1, 2]).issubset([1, 2, 3])
True
>>> set([1, 2, 3]).issuperset([1, 2])
True
Cependant, si vous utilisez des opérateurs, les deux arguments doivent être des ensembles:
>>> set([2, 1]) <= set([1, 2, 3])
True
>>> set([1, 2, 3]) >= set([2, 1])
True
>>> set([1,2,3]).issuperset(set([2,1]))
True
>>>
>>> set([1,2,3]).issuperset(set([3,5,9]))
False