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 fueran reconocidos en la lista (cuando es una lista de cadenas).
¿Es esta la forma más 'pitónica' de encontrar un elemento en una lista if x in l:
:?
myList
.Respuestas:
En cuanto a su primera pregunta: ese código está perfectamente bien y debería funcionar si
item
es igual a uno de los elementos dentromyList
. 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 su segunda pregunta: en realidad hay varias formas posibles de "encontrar" cosas en las listas.
Comprobando si hay algo adentro
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:Filtrando una colección
Es decir, encontrar todos los elementos en una secuencia que cumplan una determinada condición. Puede usar la comprensión de listas o expresiones generadoras para eso:
Este último devolverá un generador que puede imaginar como una especie de lista perezosa que solo se creará tan pronto como lo repita. Por cierto, el primero es exactamente equivalente a
en Python 2. Aquí puede ver las funciones de orden superior en funcionamiento. En Python 3,
filter
no devuelve una lista, sino un objeto tipo generador.Encontrar la primera ocurrencia
Si solo quiere lo primero que coincide con una condición (pero aún no sabe qué es), está bien usar un bucle for (posiblemente también usando la
else
cláusula, que no es muy conocida). También puedes usarque devolverá el primer partido o aumentará a
StopIteration
si no se encuentra ninguno. Alternativamente, puedes usarEncontrar la ubicación de un artículo
Para las listas, también existe el
index
método que a veces puede ser útil si desea saber dónde está un determinado elemento en la lista:Sin embargo, tenga en cuenta que si tiene duplicados,
.index
siempre devuelve el índice más bajo: ......Si hay duplicados y desea todos los índices, puede usar
enumerate()
en su lugar:fuente
if x in list
es de lo que la gente se queja porque no es una función incorporada. 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, puede (ab) usarse para eso.next()
[list comprehension...][0]
enfoqueindex()
llamadokey
que funcionara como elkey
aceptado pormax()
; por ejemplo:index(list, key=is_prime)
.Si desea encontrar un elemento o
None
usar el valor predeterminadonext
, no apareceráStopIteration
si el elemento no se encuentra en la lista:fuente
next
toma un iterador como primer parámetro y una lista / tupla NO es un iterador. Por lo tanto, deberíafirst_or_default = next(iter([x for x in lst if ...]), None)
ver docs.python.org/3/library/functions.html#next(x for x in lst if ...)
es un generador sobre la listalst
(que es un iterador). Si lo hacenext(iter([x for x in lst if ...]), None)
, debe construir la lista[x for x in lst if ...]
, que será una operación mucho más costosa.if
en una lambda y puede escribirfind(fn,list)
generalmente en lugar de ofuscar el código del generador.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:
fuente
Encontrar la primera ocurrencia
Hay una receta para eso en
itertools
:Por ejemplo, el siguiente código encuentra el primer número impar en una lista:
fuente
Otra alternativa: puede verificar si un elemento está en una lista
if item in list:
, pero este es el orden O (n). Si se trata de grandes listas de elementos y todo lo que necesita saber es si algo es miembro de su lista, puede convertir la lista a un conjunto primero y aprovechar la búsqueda de conjuntos de tiempo constante :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 crear el conjunto
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, entonces será O (1) para cada búsqueda después de la creación del conjunto inicial.fuente
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 ['uno,' ejemplo ',' dos '] o' ejemplo_1 'está en [' uno ',' ejemplo ',' dos ']):
matches = [el for el in your_list if item in el]
o
matches = [el for el in your_list if el in item]
luego simplemente revíselos
len(matches)
o léalos si es necesario.fuente
Definición y uso
El
count()
método devuelve el número de elementos con el valor especificado.Sintaxis
ejemplo:
Ejemplo de pregunta:
fuente
En lugar de usar el
list.index(x)
que devuelve el índice de x si se encuentra en la lista o devuelve un#ValueError
mensaje si no se encuentra x, podría usar ellist.count(x)
que devuelve el número de ocurrencias de x en la lista (validación de que x está realmente en la lista) o devuelve 0 de lo contrario (en ausencia de x). Lo buenocount()
es que no rompe su código ni requiere que arroje una excepción para cuando no se encuentra xfuente
Si va a verificar si el valor existe en el objeto coleccionable una vez, entonces usar el operador 'in' está bien. Sin embargo, si va a verificar más de una vez, le recomiendo usar el módulo bisect. Tenga en cuenta que el uso de datos de módulo bisecado debe ordenarse. Entonces ordena los datos una vez y luego puede usar bisect. Usar el módulo bisect en mi máquina es aproximadamente 12 veces más rápido que usar el operador 'in'.
Aquí hay un ejemplo de código que usa Python 3.8 y la sintaxis anterior:
Salida:
fuente
Verifique que no haya espacios en blanco adicionales / no deseados en los elementos de la lista de cadenas. Esa es una razón que puede interferir explicando que no se pueden encontrar los elementos.
fuente