font - subplot title python
Python: encontrar en lista (9)
Compruebe que no haya espacios en blanco adicionales / no deseados en los elementos de la lista de cadenas. Esa es una razón que puede estar interfiriendo al explicar que los elementos no se pueden encontrar.
Me he encontrado con esto:
item = someSortOfSelection()
if item in myList:
doMySpecialFunction(item)
pero a veces no funciona con todos mis elementos, como si no se reconocieran en la lista (cuando se trata de una lista de cadenas).
¿Es esta la forma más "pitónica" de encontrar un elemento en una lista: if x in l:
:?
En cuanto a su primera pregunta: ese código está perfectamente bien y debería funcionar si el item
es igual a uno de los elementos dentro de myList
. Tal vez intente encontrar una cadena que no coincida exactamente con uno de los elementos o tal vez esté utilizando un valor flotante que sufre de inexactitud.
En cuanto a tu segunda pregunta: en realidad hay varias formas posibles de "encontrar" cosas en las listas.
Comprobando si hay algo dentro
Este es el caso de uso que describe: Comprobar si algo está dentro de una lista o no. Como sabes, puedes usar el operador in
para eso:
3 in [1, 2, 3] # => True
Filtrando una colección
Es decir, encontrar todos los elementos en una secuencia que cumplan una determinada condición. Puedes usar la comprensión de listas o expresiones generadoras 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 se realice una iteración. 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, el filter
no devuelve una lista, sino un objeto similar a un generador.
Encontrando la primera ocurrencia.
Si solo desea lo primero que coincide con una condición (pero aún no sabe qué es), está bien usar un bucle for (posiblemente también se use la cláusula else
, lo que no es muy conocido). También puedes usar
next(x for x in lst if ...)
que devolverá la primera coincidencia o StopIteration
una StopIteration
si no se encuentra ninguna. Alternativamente, puedes usar
next((x for x in lst if ...), [default value])
Encontrar la ubicación de un artículo
Para las listas, también existe el método de index
que a veces puede ser útil si desea saber dónde se encuentra un determinado elemento 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()
lugar:
[i for i,x in enumerate([1,2,3,2]) if x==2] # => [1, 3]
Es posible que desee utilizar una de las dos búsquedas posibles mientras trabaja con la lista de cadenas:
si el elemento de la lista es igual a un elemento (''ejemplo'' está en [''uno'', ''ejemplo'', ''dos'']):
if item in your_list: some_function_on_true()
''ex'' en [''uno'', ''ex'', ''dos''] => Verdadero
''ex_1'' en [''uno'', ''ex'', ''dos''] => Falso
si el elemento de la lista es como un elemento (''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]
luego solo marque
len(matches)
o léalos si es necesario.
Otra alternativa: puede verificar si un artículo está en una lista con el 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 miembro de su lista, primero puede convertir la lista en un conjunto y aprovechar la búsqueda constante de conjuntos de tiempo :
my_set = set(my_list)
if item in my_set: # much faster on average than using a list
# do something
No va a ser la solución correcta en todos los casos, pero en algunos casos esto podría ofrecerle un mejor rendimiento.
Tenga en cuenta que crear el conjunto con set(my_list)
también es O (n), por lo que si solo necesita hacer esto una vez, no será más rápido hacerlo de esta manera. Sin embargo, si necesita verificar la membresía repetidamente, esto será O (1) para cada búsqueda después de la creación del conjunto inicial.
Por ejemplo, si desea encontrar el índice de todos los elementos mayores de 30:
your_list = [11,22,23,44,55]
filter(lambda x:your_list[x]>30,range(len(your_list)))
#result: [3,4]
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])
Si desea buscar un elemento o None
use el valor predeterminado en el next
, no generará StopIteration
si el elemento no se encontró en la lista:
first_or_default = next((x for x in lst if ...), None)
Encontrando la primera ocurrencia.
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
list = [10, 20, 30, 40, 50]
n = int(input("/nEnter a Number to search from the list : "))
if n in list :
print("/nMatch found")
else :
print("/nMatch not found")