Encontrar un valor en una lista [duplicate]

9 minutos de lectura

Avatar de usuario de Stephane Rolland
Stephane Rolland

Yo uso lo siguiente para comprobar si item es en my_list:

if item in my_list:
    print("Desired item is in list")

Es “if item in my_list:” la forma más “pitónica” de encontrar un elemento en una lista?

EDITAR PARA LA REAPERTURA: la pregunta se ha considerado duplicada, pero no estoy del todo convencido: aquí esta pregunta es aproximadamente “¿cuál es el más pitónico forma de encontrar un elemento en una lista”. Y la primera respuesta a la pregunta es realmente extensa en todas las formas de Python para hacer esto.

Mientras que en la pregunta duplicada vinculada y su respuesta correspondiente, el enfoque se limita aproximadamente a la palabra clave ‘in’ en Python. Creo que es realmente limitante, en comparación con la pregunta actual.

Y creo que la respuesta a esta pregunta actual es más relevante y elaborada que la respuesta de la pregunta/respuesta duplicada propuesta.

  • Eso está perfectamente bien y debería funcionar si el artículo es igual a uno de los elementos dentro myList.

    – Niklas B.

    3 de marzo de 2012 a las 2:06


  • ¿Quieres decir que era la buena manera de hacer las cosas? en mis varias pruebas, tal vez hubo espacios en blanco y saltos de línea que interfieren … solo quería estar seguro de que es la buena manera de implementar “buscar en la lista” (en general)

    – Stéphane Rolland

    3 de marzo de 2012 a las 2:09

  • Sorprendente que al buscar cómo EXTRAER un SUBCONJUNTO de una lista basada en una condición no se encontró esta pregunta y sus buenas respuestas. Quizás agregar este comentario le permitirá encontrar las palabras extracto y/o subconjunto, la próxima vez que alguien busque usando esos términos. Salud.

    – johnjps111

    29 oct 2021 a las 14:16


  • Revirtió la última revisión porque la respuesta aceptada se basó en la versión anterior.

    – Gert Arnold está en huelga

    13 de agosto de 2022 a las 21:08

  • @ johnjps111 eso se debe en parte a que la respuesta principal aquí respondió un montón de preguntas no formuladas sobre especulaciones. No es así como se pretende que funcione Stack Overflow; es no es un foro de discusión. Eso dicho “extraer un subconjunto” me suena a muy extraño forma de describir el proceso de averiguar qué elementos de una lista cumplen una condición.

    – Karl Knechtel

    23 de enero a las 2:45

Avatar de usuario de Niklas B.
Niklas B.

En cuanto a tu primera pregunta: “if item is in my_list:” está perfectamente bien y debería funcionar si item es igual a uno de los elementos dentro my_list. El artículo debe exactamente coincidir con un elemento de la lista. Por ejemplo, "abc" y "ABC" no coinciden. Los valores de punto flotante en particular pueden sufrir imprecisiones. Por ejemplo, 1 - 1/3 != 2/3.

En cuanto a su segunda pregunta: en realidad, hay varias formas posibles de “encontrar” cosas en las listas.

Comprobar si hay algo dentro

Este es el caso de uso que describe: verificar si algo está dentro de una lista o no. Como sabes, puedes usar el in operador para eso:

3 in [1, 2, 3] # => True

Filtrar una colección

Es decir, encontrar todos los elementos de una secuencia que cumplan una determinada condición. Puede usar listas de comprensión o generadores de expresiones para eso:

matches = [x for x in lst if fulfills_some_condition(x)]
matches = (x for x in lst if x > 6)

Este último devolverá un generador que puede imaginar como una especie de lista perezosa que solo se construirá tan pronto como la repita. Por cierto, el primero es exactamente equivalente a

matches = filter(fulfills_some_condition, lst)

en Python 2. Aquí puede ver funciones de orden superior en funcionamiento. En Python 3, filter no devuelve una lista, sino un objeto similar a un generador.

Encontrar la primera aparición

Si solo desea lo primero que coincida con una condición (pero aún no sabe cuál es), está bien usar un bucle for (posiblemente usando el else cláusula también, que no es muy conocida). También puedes usar

next(x for x in lst if ...)

que devolverá el primer partido o levantará una StopIteration si no se encuentra ninguno. Como alternativa, puede utilizar

next((x for x in lst if ...), [default value])

Encontrar la ubicación de un elemento

Para las listas, también está el index método que a veces puede ser útil si quieres saber dónde cierto elemento está en la lista:

[1,2,3].index(2) # => 1
[1,2,3].index(4) # => ValueError

Sin embargo, tenga en cuenta que si tiene duplicados, .index siempre devuelve el índice más bajo:……

[1,2,3,2].index(2) # => 1

Si hay duplicados y desea todos los índices, puede usar enumerate() en cambio:

[i for i,x in enumerate([1,2,3,2]) if x==2] # => [1, 3]

  • Stephane: Déjame reformularlo: if x in list es no lo que la gente se queja de no ser una función integrada. Se quejan del hecho de que no hay una forma explícita de encontrar la primera aparición de algo en una lista que coincida con una determinada condición. Pero como se indica en mi respuesta, next() puede ser (ab) utilizado para eso.

    – Niklas B.

    3 de marzo de 2012 a las 2:21


  • @Stephane: el segundo no genera una tupla, sino un generador (que es una lista aún no construida, básicamente). Si desea usar el resultado solo una vez, generalmente es preferible un generador. Sin embargo, si desea utilizar la colección creada varias veces después, es recomendable crear una lista explícita en primer lugar. Echa un vistazo a mi actualización, ahora está un poco mejor estructurada 🙂

    – Niklas B.

    3 de marzo de 2012 a las 2:30

  • Su ejemplo de “encontrar la primera ocurrencia” es dorado. Se siente más pitónico que el [list comprehension...][0] acercarse

    – acjay

    3 de marzo de 2013 a las 15:52

  • Estoy cada vez más desilusionado con las capacidades ‘funcionales’ de Python. En haskell hay una función de búsqueda en el módulo Data.List que hace exactamente eso. Pero en python no lo es y es demasiado pequeño para convertirlo en una biblioteca, por lo que debe volver a implementar la misma lógica una y otra vez. Que desperdicio…

    – usuario1685095

    9 de enero de 2016 a las 19:19

  • Sería bueno si hubiera un kwarg para index() llamado key que funcionó como el key aceptado por max(); Por ejemplo: index(list, key=is_prime).

    – Curto

    16 de agosto de 2016 a las 3:26


Si desea encontrar un elemento o None usar por defecto en nextno subirá StopIteration si el artículo no se encuentra en la lista:

first_or_default = next((x for x in lst if ...), None)

  • next toma un iterador como primer parámetro y una lista/tupla NO es un iterador. asi que deberia ser first_or_default = next(iter([x for x in lst if ...]), None) ver docs.python.org/3/library/functions.html#next

    – Devy

    28 de marzo de 2016 a las 15:45

  • @Devy: así es, pero (x for x in lst if ...) es un generador sobre la lista lst (cual es un iterador). Si lo haces next(iter([x for x in lst if ...]), None)tienes que construir la lista [x for x in lst if ...]que será una operación mucho más costosa.

    –Erlend Graff

    20 de abril de 2016 a las 7:12

  • Hay una abstracción aquí para definir una función de búsqueda. Simplemente encapsule la expresión booleana del if en una lambda y puedes escribir find(fn,list) generalmente en lugar de ofuscar el código del generador.

    – semiomante

    29 de marzo de 2017 a las 8:10

Si bien la respuesta de Niklas B. es bastante completa, cuando queremos encontrar un elemento en una lista, a veces es útil obtener su índice:

next((i for i, x in enumerate(lst) if [condition on x]), [default value])

  • Quieres simplificarlo un poco.

    – Aleatorio

    21 de agosto de 2022 a las 21:36

Avatar de usuario de Antony Hatchkins
Antonio Hatchkins

Encontrar la primera aparición

Hay una receta para eso en itertools:

def first_true(iterable, default=False, pred=None):
    """Returns the first true value in the iterable.

    If no true value is found, returns *default*

    If *pred* is not None, returns the first item
    for which pred(item) is true.

    """
    # first_true([a,b,c], x) --> a or b or c or x
    # first_true([a,b], x, f) --> a if f(a) else b if f(b) else x
    return next(filter(pred, iterable), default)

Por ejemplo, el siguiente código encuentra el primer número impar en una lista:

>>> first_true([2,3,4,5], None, lambda x: x%2==1)
3  

Puedes copiarlo/pegarlo o instalarlo more-itertools

pip3 install more-itertools

donde esta receta ya está incluida.

Avatar de usuario de Ingeniero
Ingeniero

Otra alternativa: puedes comprobar si un elemento está en una lista con if item in list:, pero este es el orden O(n). Si está tratando con grandes listas de elementos y todo lo que necesita saber es si algo es un miembro de su lista, primero puede convertir la lista en un conjunto y aprovechar búsqueda de conjunto de tiempo constante:

my_set = set(my_list)
if item in my_set:  # much faster on average than using a list
    # do something

No será la solución correcta en todos los casos, pero en algunos casos esto podría brindarle un mejor rendimiento.

Tenga en cuenta que la creación del conjunto con set(my_list) también es O(n), por lo que si solo necesita hacer esto una vez, no es más rápido hacerlo de esta manera. Sin embargo, si necesita verificar repetidamente la membresía, será O (1) para cada búsqueda después de la creación del conjunto inicial.

avatar de usuario de josef
José

Definición y uso

el count() método devuelve el número de elementos con el valor especificado.

Sintaxis

list.count(value)

ejemplo:

fruits = ['apple', 'banana', 'cherry']

x = fruits.count("cherry")

Ejemplo de pregunta:

item = someSortOfSelection()

if myList.count(item) >= 1 :

    doMySpecialFunction(item)

Avatar de usuario de Alexey Antonenko
Alexei Antonenko

Es posible que desee utilizar una de las dos búsquedas posibles mientras trabaja con una lista de cadenas:

  1. si el elemento de la lista es igual a un artículo (‘ejemplo’ está en
    [‘one’,’example’,’two’]):

    if item in your_list: some_function_on_true()

    ‘ex’ en [‘one’,’ex’,’two’] => Verdadero

    ‘ex_1’ en [‘one’,’ex’,’two’] => Falso

  2. si el elemento de la lista es como un artículo (‘ex’ está en
    [‘one,’example’,’two’] o ‘example_1’ está en
    [‘one’,’example’,’two’]):

    matches = [el for el in your_list if item in el]

    o

    matches = [el for el in your_list if el in item]

    entonces solo revisa len(matches) o léalos si es necesario.

¿Ha sido útil esta solución?