Python: kijken of de ene set een andere bevat?

Is er een snelle manier om te controleren of de ene set een andere bevat?

Zoiets als:

>>>[1, 2, 3].containsAll([2, 1])
True
>>>[1, 2, 3].containsAll([3, 5, 9])
False

Antwoord 1, autoriteit 100%

Dat zijn lijsten, maar als je echt sets bedoelt, kun je de issubsetmethode.

>>> s = set([1,2,3])
>>> t = set([1,2])
>>> t.issubset(s)
True
>>> s.issuperset(t)
True

Voor een lijst kun je niet beter doen dan elk element te controleren.


Antwoord 2, autoriteit 27%

Voor de volledigheid: dit komt overeen met issubset(hoewel aantoonbaar een beetje minder expliciet/leesbaar):

>>> set([1,2,3]) >= set([2,1])
True
>>> set([1,2,3]) >= set([3,5,9])
False

Antwoord 3, autoriteit 5%

U kunt ofwel set.issubset()of set.issuperset()(of hun tegenhangers op basis van een operator: <=en >=). Merk op dat de methoden elke iterabeleals argument accepteren, niet alleen een set:

>>> {1, 2}.issubset([1, 2, 3])
True
>>> {1, 2, 3}.issuperset([1, 2])
True

Als u echter operators gebruikt, moeten beide argumenten sets zijn:

>>> {1, 2} <= {1, 2, 3}
True
>>> {1, 2, 3} >= {1, 2}
True

Antwoord 4, autoriteit 3%

Eén optie blijft onaangeroerd — aftrekken:

>>> {1, 2} - {1, 2, 3}
set([])
>>> {1, 2, 3} - {1, 2}
set([3])

In principe controleer je welke elementen in de eerste lijst niet in de tweede lijst staan.

Ik vond het erg handig omdat je kon laten zien welke waarden ontbreken:

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

Antwoord 5, autoriteit 3%

Als je vermoedt dat een set een subset van een andere is en deze twee sets samen snijdt, is het resultaat gelijk aan zichzelf als het een subset is.

a = [2,1,3,3]
b = [5,4,3,2,1]
set(a).intersection(set(b)) == set(a)
>>True

Antwoord 6

>>> set([1,2,3]).issuperset(set([2,1]))
True
>>> set([1,2,3]).issuperset(set([3,5,9]))
False

Antwoord 7

Hieronder retourneert de functie 0 als de hoofdlijst de sublijst niet volledig bevat en 1 als deze de volledige lijst bevat.

def islistsubset(sublist,mainlist):
     for item in sublist:
             if item in mainlist:
                     contains = 1
             else:
                     contains = 0
                     break;
     return contains

Other episodes