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
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
Antworten:
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
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
Sie können entweder set.issubset()
oder set.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
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
A = set(a)
und B = set(b)
für die Vernunft. Dann ist dieser Vergleich effizient auf reduzierbar len(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 effizient issubset()
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
any(item in mainlist for item in sublist)
.