175 Stimmen

Wie kann man überprüfen, ob alle der folgenden Elemente in einer Liste enthalten sind?

Ich habe herausgefunden, dass es eine verwandte Frage gibt, wie man herausfinden kann, ob mindestens ein Element in einer Liste existiert:
Wie kann man überprüfen, ob einer der folgenden Punkte in einer Liste enthalten ist?

Aber was ist der beste und pythonische Weg, um herauszufinden, ob alle Elemente in einer Liste vorhanden sind?

Beim Durchsuchen der Dokumente habe ich diese Lösung gefunden:

>>> l = ['a', 'b', 'c']
>>> set(['a', 'b']) <= set(l)
True
>>> set(['a', 'x']) <= set(l)
False

Eine andere Lösung wäre die folgende:

>>> l = ['a', 'b', 'c']
>>> all(x in l for x in ['a', 'b'])
True
>>> all(x in l for x in ['a', 'x'])
False

Aber hier müssen Sie mehr tippen.

Gibt es noch andere Lösungen?

273voto

Glenn Maynard Punkte 53282

Operatoren wie <= in Python werden im Allgemeinen nicht überschrieben, um etwas wesentlich anderes als "kleiner als oder gleich" zu bedeuten. Es ist ungewöhnlich für die Standardbibliothek tut dies - es riecht wie Legacy-API zu mir.

Verwenden Sie die gleichwertige und klarer benannte Methode, set.issubset . Beachten Sie, dass Sie das Argument nicht in eine Menge umwandeln müssen; das wird bei Bedarf für Sie erledigt.

set(['a', 'b']).issubset(['a', 'b', 'c'])

72voto

tsimbalar Punkte 5600

Ich würde wahrscheinlich Folgendes verwenden set auf folgende Weise:

set(l).issuperset(set(['a','b'])) 

oder andersherum:

set(['a','b']).issubset(set(l)) 

Ich finde es etwas lesbarer, aber vielleicht ist es zu viel des Guten. Mengen sind besonders nützlich, um Vereinigungen/Schnitte/Differenzen zwischen Sammlungen zu berechnen, aber es ist vielleicht nicht die beste Option in dieser Situation ...

22voto

martineau Punkte 110783

Ich mag diese beiden, weil sie mir am logischsten erscheinen, wobei die letztere kürzer und wahrscheinlich am schnellsten ist (hier mit set buchstabengetreue Syntax, die zurückgeschickt zu Python 2.7):

all(x in {'a', 'b', 'c'} for x in ['a', 'b'])
#   or
{'a', 'b'}.issubset({'a', 'b', 'c'})

12voto

Max Punkte 1477

Was ist, wenn Ihre Listen Duplikate wie diese enthalten?

v1 = ['s', 'h', 'e', 'e', 'p']
v2 = ['s', 's', 'h']

Die Sätze enthalten keine Duplikate. Die folgende Zeile gibt also True zurück.

set(v2).issubset(v1)

Zum Zählen von Duplikaten können Sie den Code verwenden:

v1 = sorted(v1)
v2 = sorted(v2)

def is_subseq(v2, v1):
    """Check whether v2 is a subsequence of v1."""
    it = iter(v1)
    return all(c in it for c in v2) 

Die folgende Zeile gibt also False zurück.

is_subseq(v2, v1)

2voto

Julio Cezar Silva Punkte 1640

Es geht nicht um den Fall von OP, aber - für jeden, der eine Kreuzung in Diagramme und durch schlechtes Googeln (z. B. bei mir) hier gelandet sind - müssen Sie mit dict.items :

>>> a = {'key': 'value'}
>>> b = {'key': 'value', 'extra_key': 'extra_value'}
>>> all(item in a.items() for item in b.items())
True
>>> all(item in b.items() for item in a.items())
False

Das liegt daran, dass dict.items gibt Tupel von Schlüssel/Wert-Paaren zurück, und wie jedes Objekt in Python sind sie austauschbar

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X