2010-04-06 10 views

Respuesta

27

Depende de lo que quiere decir con "contenido". Tal vez esto:

if set(a) <= set(b): 
    print "a is in b" 
+0

trabajo sencillo y . Comprobaré el uso de 'set '.Gracias. – Young

+0

Parece funcionalmente equivalente a mi solución: ¿alguien sabe si alguno tiene una ventaja de rendimiento? – Etaoin

+0

No estoy seguro de que compre eso: la llamada a 'sub' es lineal, pero' '=' no puede ser libre. ¿Me estoy perdiendo de algo? – Etaoin

10

Suponiendo que desea ver si todos los elementos de sublist son también elementos de superlist:

all(x in superlist for x in sublist)

2

la solución depende de los valores que se espera de sus listas.

si existe la posibilidad de una repetición de un valor, y hay que comprobar que no hay suficientes valores en el contenedor a prueba, entonces aquí es una solución en tiempo ineficaz:

def contained(candidate, container): 
    temp = container[:] 
    try: 
     for v in candidate: 
      temp.remove(v) 
     return True 
    except ValueError: 
     return False 

prueba de esta función con:

>>> a = [1,1,2,3] 
>>> b = [1,2,3,4,5] 
>>> contained(a,b) 
False  
>>> a = [1,2,3] 
>>> contained(a,b) 
True 
>>> a = [1,1,2,4,4] 
>>> b = [1,1,2,2,2,3,4,4,5] 
>>> contained(a,b) 
True 

por supuesto esta solución se puede mejorar en gran medida: list.remove() es potencialmente consume mucho tiempo y se puede evitar el uso de clasificación inteligente y la indexación. pero no veo cómo evitar un bucle aquí ...

(de todos modos, cualquier otra solución será implementada utilizando conjuntos o list-comprensiones, que están usando bucles internos ...)

+0

tarde pero impresionante. gracias por la claridad. – Young

Cuestiones relacionadas