Gibt es eine schnelle Möglichkeit zu überprüfen, ob ein Satz einen anderen vollständig enthält?
Etwas wie:
>>>[1, 2, 3].containsAll([2, 1])
True
>>>[1, 2, 3].containsAll([3, 5, 9])
False
Das sind Listen, aber wenn Sie wirklich Mengen meinen, können Sie die issubset-Methode verwenden.
>>> s = set([1,2,3])
>>> t = set([1,2])
>>> t.issubset(s)
True
>>> s.issuperset(t)
True
Für eine Liste können Sie nichts Besseres tun, als jedes Element zu überprüfen.
issubset()
is notcontains()
Der Vollständigkeit
issubset
halber : Dies entspricht (obwohl wohl etwas weniger explizit / lesbar):>>> set([1,2,3]) >= set([2,1]) True >>> set([1,2,3]) >= set([3,5,9]) False
quelle
Eine Option bleibt unberührt - Subtraktion:
>>> {1, 2} - {1, 2, 3} set([]) >>> {1, 2, 3} - {1, 2} set([3])
Grundsätzlich prüfen Sie, welche Elemente in der ersten Liste nicht in der zweiten Liste enthalten sind.
Ich fand es sehr praktisch, da Sie zeigen konnten, welche Werte fehlen:
>>> 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
quelle
Sie können entweder
set.issubset()
oderset.issuperset()
(oder deren auf Operatoren basierende Gegenstücke verwenden:<=
und>=
). Beachten Sie, dass die Methoden alle iterierbaren Elemente als Argument akzeptieren , nicht nur eine Menge:>>> {1, 2}.issubset([1, 2, 3]) True >>> {1, 2, 3}.issuperset([1, 2]) True
Wenn Sie jedoch Operatoren verwenden, müssen beide Argumente gesetzt sein:
>>> {1, 2} <= {1, 2, 3} True >>> {1, 2, 3} >= {1, 2} True
quelle
Wenn Sie vermuten, dass eine Menge eine Teilmenge einer anderen ist und diese beiden Mengen miteinander überschneiden, ist das Ergebnis gleich, wenn es sich um eine Teilmenge handelt.
a = [2,1,3,3] b = [5,4,3,2,1] set(a).intersection(set(b)) == set(a) >>True
quelle
A = set(a)
undB = set(b)
für die Vernunft. Dann ist dieser Vergleich effizient auf reduzierbarlen(A.intersection(B)) == len(A)
. Das heißt, die Mengen selbst müssen nicht elementweise verglichen werden; Es muss nur die Kardinalität dieser Mengen verglichen werden. Selbst diese Optimierung reicht wahrscheinlich nicht aus, um diesen Ansatz vorzuziehen. Die dramatisch besser lesbar und effizientissubset()
und<=
Ansätze sind fast sicher , was alle wollen.Unterhalb der Funktion wird 0 zurückgegeben, wenn die Hauptliste die Unterliste nicht vollständig enthält, und 1, wenn sie vollständig enthält.
def islistsubset(sublist,mainlist): for item in sublist: if item in mainlist: contains = 1 else: contains = 0 break; return contains
quelle
any(item in mainlist for item in sublist)
.>>> set([1,2,3]).issuperset(set([2,1])) True >>> >>> set([1,2,3]).issuperset(set([3,5,9])) False
quelle