Estoy tratando de encontrar una manera corta de ver si alguno de los siguientes elementos está en una lista, pero mi primer intento no funciona. Además de escribir una función para lograr esto, es la forma más corta de verificar si uno de los múltiples elementos está en una lista.
>>> a = [2,3,4]
>>> print (1 or 2) in a
False
>>> print (2 or 1) in a
True
a = [1, 2] b = [3, 5, 2, 6, 8, 9] c = [3, 5, 6, 8, 1, 9] print( (1 and 2) in b ,(2 and 1) in b ,(1 and 2) in c ,(2 and 1) in c, sep='\n')
es Verdadero Falso Falso VerdaderoRespuestas:
Tanto las listas vacías como los conjuntos vacíos son falsos, por lo que puede usar el valor directamente como un valor de verdad.
fuente
any
puede regresar temprano tan pronto como encuentre unTrue
valor, no tiene que construir la lista completa primeroAh, Tobías, me ganaste. Estaba pensando en esta ligera variación en su solución:
fuente
x in long for x in short
vsx in short for x in long
)a
yb
tienen la misma longitud, máximo y mínimo devolverá el del extremo izquierdo lista, lo que hace laany()
llamada operar sobre la misma lista en ambos lados. Si necesita absolutamente la comprobación de longitud, invertir el orden de las listas en la segunda llamada:any(x in max(a, b, key=len) for x in (b, a, key=len))
.any(x in max(a, b, key=len) for x in min(b, a, key=len))
(perdí el mínimo).Quizás un poco más vago:
fuente
any
puede regresar antes, mientras que su versión tiene que construir toda la lista a partir de la comprensión antes deany
poder usarla. La respuesta de @ user89788 es ligeramente mejor porque los paréntesis dobles son innecesarios¡Piensa en lo que el código realmente dice!
Eso probablemente debería explicarlo. :) Python aparentemente implementa "perezoso o", lo que no debería sorprendernos. Lo realiza algo como esto:
En el primer ejemplo,
x == 1
yy == 2
. En el segundo ejemplo, es al revés. Es por eso que devuelve diferentes valores dependiendo del orden de ellos.fuente
Código de la versión de golf. Considere usar un conjunto si tiene sentido hacerlo. Me parece más legible que una lista de comprensión.
fuente
1 línea sin listas de comprensión.
fuente
Lo mejor que se me ocurrió:
fuente
En python 3 podemos comenzar a utilizar el asterisco desempaquetado. Dadas dos listas:
Editar: incorporar la sugerencia de alkanen
fuente
Cuando piense "comprobar para ver si a en b", piense en hashes (en este caso, conjuntos). La forma más rápida es hacer un hash de la lista que desea verificar, y luego verificar cada elemento allí.
Es por eso que la respuesta de Joe Koberg es rápida: verificar la intersección del conjunto es muy rápido.
Sin embargo, cuando no tienes muchos datos, hacer conjuntos puede ser una pérdida de tiempo. Por lo tanto, puede hacer un conjunto de la lista y simplemente verificar cada elemento:
Cuando el número de artículos que desea verificar es pequeño, la diferencia puede ser insignificante. Pero compruebe muchos números en una lista grande ...
pruebas:
velocidades:
El método que es consistentemente rápido es hacer un conjunto (de la lista), ¡pero la intersección funciona mejor en conjuntos de datos grandes!
fuente
En algunos casos (p. Ej., Elementos de lista únicos), se pueden usar operaciones de conjuntos.
O, usando set.isdisjoint () ,
fuente
Esto lo hará en una línea.
fuente
Recopilé varias de las soluciones mencionadas en otras respuestas y en comentarios, luego realicé una prueba de velocidad.
not set(a).isdisjoint(b)
resultó ser el más rápido, tampoco disminuyó mucho cuando el resultado fueFalse
.Cada una de las tres ejecuciones prueba una pequeña muestra de las posibles configuraciones de
a
yb
. Los tiempos están en microsegundos.fuente
Tengo que decir que mi situación puede no ser lo que está buscando, pero puede proporcionar una alternativa a su pensamiento.
He intentado tanto el método set () como cualquier método () pero aún tengo problemas con la velocidad. Entonces recordé que Raymond Hettinger dijo que todo en Python es un diccionario y usa dict siempre que puedes. Entonces eso es lo que probé.
Usé un defaultdict con int para indicar resultados negativos y usé el elemento en la primera lista como la clave para la segunda lista (convertida a defaultdict). Debido a que tiene una búsqueda instantánea con dict, sabe de inmediato si ese elemento existe en el defaultdict. Sé que no siempre puedes cambiar la estructura de datos para tu segunda lista, pero si puedes hacerlo desde el principio, entonces es mucho más rápido. Es posible que deba convertir list2 (lista más grande) a un valor predeterminado, donde clave es el valor potencial que desea verificar de una lista pequeña, y el valor es 1 (acierto) o 0 (sin acierto, predeterminado).
fuente
Sencillo.
fuente
a
está en la listab
.