2012-09-04 1 views
8

Mögliche Duplizieren:
Python Check if all of the following items is in a list, wenn mehrere Objekte in einer Liste mit einer "in" Statement (Python)

Deshalb möchte ich, ob beide Wort testen und word1 sind in die Liste lst. Natürlich könnte ich schreiben:

if word in lst and word1 in lst: 
    do x 

Aber ich frage mich, ob ich diese Aussage etwas wie verkürzen könnte:

if (word and word1) in lst: 
    do x 

Natürlich, die nicht ist nicht funktioniert, aber etwas die gleiche Wirkung hat, dass werden?

Ich habe Folgendes versucht, aber wie Sie sehen können, liefert es nicht das gewünschte Ergebnis.

>>> word in lst 
True 
>>> word1 in lst 
True 
>>> (word, word1) in lst 
False 

EDIT: Vielen Dank für die Antworten, ich glaube, ich habe eine ziemlich gute Vorstellung davon, wie dies jetzt zu tun.

+9

Versuchen 'set (lst) .issubset ([Wort, word1])' http://stackoverflow.com/questions/3931541/python- check-if-all-der-folgenden-Items-ist-in-einer-Liste –

Antwort

9

Die Antworten richtig sind (mindestens ein:

if all((w in lst for w in ["word1", "word2", "etc"])): 
    ... 
7

Machen Sie eine Liste Ihrer Worte und einen Generator Ausdruck überprüft, ob sie in der Liste enthalten sind:

words = ["word1", "word2", "etc"] 
lst = [...] 
if all((w in lst for w in words)): 
    #do something 

all prüft, ob alle Werte in einem iterable wahr sind. Da wir einen Generator verwenden, ist dieser immer noch kurzschlussoptimiert. Natürlich können Sie die Liste der Wörter inline, wenn sie nicht zu groß für einen Einzeiler ist:

if all(current_word in lst for current_word in (word, word1)): 
    do x 
+4

Sie haben eine zusätzliche Reihe von Parens in beiden Beispielen. Genexps, die die einzigen Argumente für Callables sind, können einfach 'all (foo for foo in thing)' geschrieben werden. – Julian

+1

Ich weiß, aber ich bevorzuge es, sie explizit in Klammern zu schreiben. Das macht es einfacher zu sehen, da ist ein iterable da und hilft beim Refactoring ... die zusätzlichen Parens kommen praktisch mit vim :) – l4mpi

2

Sie es so tun könnte von ihnen ist). Wenn Sie jedoch Eindämmungsprüfungen durchführen und sich nicht um die Reihenfolge kümmern, wie in Ihrem Beispiel vorgeschlagen, lautet die wirkliche Antwort, dass Sie Sätze verwenden und nach Teilmengen suchen sollten.

words = {"the", "set", "of", "words"} 
if words <= set_of_words: 
    do_stuff() 
1

Hinweis: Verwenden Sie das niemals. Es ist einfach hier, um "noch eine andere" Fähigkeit von Python zu veranschaulichen.

Eine weniger effiziente Lösung:

>>> from itertools import permutations 
>>> lis=[0,1,2,3,4] 
>>> (1,2) in (z for z in permutations(lis,2)) #loop stops as soon as permutations(lis,2) yields (1,2) 
True 
>>> (1,6) in (z for z in permutations(lis,2)) 
False 
>>> (4,2) in (z for z in permutations(lis,2)) 
True 
>>> (0,5) in (z for z in permutations(lis,2)) 
False 
>>> (0,4,1) in (z for z in permutations(lis,3)) 
True 
>>> (0,4,5) in (z for z in permutations(lis,3)) 
False 
Verwandte Themen