¿Existe una función de contenido corto para listas?


515

Veo que la gente está usando anypara recopilar otra lista para ver si un elemento existe en una lista, pero ¿hay alguna forma rápida de hacerlo ?:

if list.contains(myItem):
    # do something

¿Su pregunta implica que solo le interesa que la lista contenga un elemento , no que la lista contenga una sublista? / tuple / set / frozenset / ...?
smci

Respuestas:


875

Puedes usar esta sintaxis:

if myItem in list:
    # do something

Además, operador inverso:

if myItem not in list:
    # do something

Funciona bien para listas, tuplas, conjuntos y dictados (teclas de verificación).

Tenga en cuenta que esta es una operación O (n) en listas y tuplas, pero una operación O (1) en conjuntos y dictados.


1
Con una lista que contiene matrices numpy, ¿esto verificará si hay instancias o valores numpy dentro de las instancias numpy?
Daniel Möller

¡Cuidado! Esto coincide, mientras que esto es muy probablemente lo que no esperaba:o='--skip'; o in ("--skip-ias"); # returns True !
Alex F

3
@AlexF: Eso coincide porque ("--skip-ias")no es una tupla, sino una cadena (los paréntesis no hacen nada, simplemente (1)es un número entero). Si desea una tupla de 1, debe agregar una coma después del elemento individual: ("--skip-ias",)(o (1,)).
Blckknght

Tenga en cuenta que si está comparando caracteres, esto no distingue entre mayúsculas y minúsculas.
Tillson

65

Además de lo que otros han dicho, también puede interesarle saber que lo que inhace es llamar al list.__contains__método, que puede definir en cualquier clase que escriba y puede ser extremadamente útil para usar Python en toda su extensión.  

Un uso tonto puede ser:

>>> class ContainsEverything:
    def __init__(self):
        return None
    def __contains__(self, *elem, **k):
        return True


>>> a = ContainsEverything()
>>> 3 in a
True
>>> a in a
True
>>> False in a
True
>>> False not in a
False
>>>         

5

Se me ocurrió esta línea recientemente para saber Truesi una lista contiene cualquier número de ocurrencias de un elemento, oFalse si no contiene ocurrencias o nada en absoluto. El uso next(...)le da a este un valor de retorno predeterminado ( False) y significa que debería ejecutarse significativamente más rápido que ejecutar toda la comprensión de la lista.

list_does_contain = next((True for item in list_to_test if item == test_item), False)


En mi caso, tengo una lista de objetos llamada Categoría y la necesito para probar solo la propiedad Enlace, por lo que esta solución encaja mejor en mi caso. Gracias
rodrigorf

3
any(item == test_item for item in list_to_test)funcionaría también, creo?
alguien el

3

El método de lista indexdevolverá -1si el elemento no está presente, y devolverá el índice del elemento en la lista si está presente. Alternativamente, en una ifdeclaración puede hacer lo siguiente:

if myItem in list:
    #do things

También puede verificar si un elemento no está en una lista con la siguiente instrucción if:

if myItem not in list:
    #do things

15
El indexmétodo no devuelve -1 si el elemento no está presente, arroja una ValueErrorexcepción.
MondKin
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.