a = [1,2,3,4,5]
b = [1,3,5,6]
c = a and b
print c
salida real: [1,3,5,6]
salida esperada:[1,3,5]
¿Cómo podemos lograr una operación AND booleana (intersección de lista) en dos listas?
python
arrays
intersection
csguy11
fuente
fuente
a and b
funciona como la siguiente declaración de la documentación lo menciona: " La expresiónx and y
primero evalúax
; six
es falsa, se devuelve su valor; de lo contrario,y
se evalúa y se devuelve el valor resultante " .Respuestas:
Si el orden no es importante y no necesita preocuparse por los duplicados, puede usar la intersección establecida:
fuente
a = [1,1,2,3,4,5]
yb = [1,1,3,5,6]
luego la intersección es[1,1,3,5]
pero por el método anterior dará como resultado una sola,1
es decir,[1, 3, 5]
cuál será la forma de escribir para hacerlo entonces?intersection
se entiende comúnmente como basado en conjunto . Está buscando un animal ligeramente diferente, y es posible que deba hacerlo manualmente clasificando cada lista y fusionando los resultados, y manteniendo duplicados en la fusión.Usar las comprensiones de listas es bastante obvio para mí. No estoy seguro sobre el rendimiento, pero al menos las cosas permanecen en las listas.
[x for x in a if x in b]
O "todos los valores de x que están en A, si el valor de X está en B".
fuente
b
un set y tendrás O (n)Si convierte la mayor de las dos listas en un conjunto, puede obtener la intersección de ese conjunto con cualquier iterable usando
intersection()
:fuente
list(set(a) & set(b))
Haz un set con el más grande:
Luego,
hará lo que quiera (preservar
b
los pedidos, noa
los que no necesariamente pueden preservar ambos ) y lo hará rápidamente . (El usoif x in a
como la condición en la comprensión de la lista también funcionaría y evitaría la necesidad de construir_auxset
, pero desafortunadamente para las listas de longitud considerable sería mucho más lento).Si desea que se ordene el resultado, en lugar de preservar el orden de cualquiera de las listas, una forma aún más ordenada podría ser:
fuente
Aquí hay un código de Python 2 / Python 3 que genera información de sincronización tanto para los métodos basados en listas como para establecer la intersección de dos listas.
Los algoritmos de comprensión de la lista pura son O (n ^ 2), ya que
in
en una lista hay una búsqueda lineal. Los algoritmos basados en conjuntos son O (n), ya que la búsqueda de conjuntos es O (1), y la creación de conjuntos es O (n) (y convertir un conjunto en una lista también es O (n)). Entonces, para n suficientemente grandes, los algoritmos basados en conjuntos son más rápidos, pero para pequeños n los gastos generales de creación de los conjuntos los hacen más lentos que los algoritmos de compilación de listas puras.salida
Generado utilizando una máquina de un solo núcleo de 2 GHz con 2 GB de RAM que ejecuta Python 2.6.6 en una versión Debian de Linux (con Firefox ejecutándose en segundo plano).
Estas cifras son solo una guía aproximada, ya que las velocidades reales de los diversos algoritmos se ven afectadas de manera diferente por la proporción de elementos que se encuentran en ambas listas de origen.
fuente
Debería funcionar como un sueño. Y, si puede, ¡use conjuntos en lugar de listas para evitar que cambie todo este tipo!
fuente
Se puede lograr una forma funcional usando
filter
ylambda
operador.Editar: filtra x que existe tanto en la lista1 como en la lista, la diferencia establecida también se puede lograr usando:
Edit2: python3
filter
devuelve un objeto de filtro, encapsulado conlist
devuelve la lista de salida.fuente
list(filter(lambda x:x in list1, list2))
para obtenerlo como una lista.Este es un ejemplo cuando necesita Cada elemento en el resultado debe aparecer tantas veces como se muestra en ambas matrices.
fuente
Puede que sea tarde, pero solo pensé que debería compartir el caso en el que se requiere que lo haga manualmente (mostrar trabajo - jaja) O cuando necesite que todos los elementos aparezcan tantas veces como sea posible o cuando también necesite que sea único .
Tenga en cuenta que también se han escrito pruebas para ello.
fuente
Si, por AND booleano, quiere decir elementos que aparecen en ambas listas, por ejemplo, intersección, entonces debería mirar Python
set
y losfrozenset
tipos.fuente
¡También puedes usar un contador! No conserva el orden, pero considerará los duplicados:
fuente