2012-09-04 6 views
8

Duplicar posibles:
Python Check if all of the following items is in a listComprobando si varios objetos están en una lista utilizando uno "en" declaración (Python)

así que quiero probar si tanto de palabra como palabra1 están en la lista lst. Por supuesto, podría escribir:

if word in lst and word1 in lst: 
    do x 

pero me preguntaba si podría acortar esa declaración a algo como:

if (word and word1) in lst: 
    do x 

Por supuesto, que no funciona, pero ¿hay algo con eficacia similar que ¿será?

Intenté lo siguiente, pero como puede ver, no da el resultado deseado.

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

EDIT: Gracias por las respuestas, creo que tengo una idea bastante buena de cómo hacer esto ahora.

+9

Trate 'set (LST) .issubset ([palabra, word1])' http://stackoverflow.com/questions/3931541/python- check-if-all-of-the-following-items-is-in-a-list –

Respuesta

9

Las respuestas son correctas (por lo menos una de ellos es). Sin embargo, si está haciendo controles de contención y no le importa el orden, como su ejemplo podría sugerir, la verdadera respuesta es que debe usar conjuntos y verificar subconjuntos.

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

Haga una lista de sus palabras y una expresión generadora comprobando si están en la lista:

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

all comprueba si todos los valores en un iterable son ciertas. Debido a que usamos un generador, este sigue siendo de cortocircuito optimizado. Por supuesto puede Inline la lista de palabras si no es demasiado grande para una sola línea:

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

Tiene un conjunto adicional de parens en ambos ejemplos. Los genexps que son los únicos argumentos para los callables pueden escribirse 'all (foo for foo in thing)'. – Julian

+1

Lo sé, pero prefiero escribirlos explícitamente entre paréntesis. Esto hace que sea más fácil ver que hay un iterable allí y ayuda a refactorizar ... los parientes adicionales son útiles usando vim :) – l4mpi

2

que podría hacerlo así:

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

Nota: No lo use nunca. Simplemente está aquí para ilustrar la capacidad "otra más" de python.

Una solución menos eficiente:

>>> 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 
Cuestiones relacionadas