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 issubset
methode.
>>> 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