filtro de matriz en Python?

85

Por ejemplo, tengo dos listas

 A           = [6, 7, 8, 9, 10, 11, 12]
subset_of_A  = [6, 9, 12]; # the subset of A


the result should be [7, 8, 10, 11]; the remaining elements 

¿Hay una función incorporada en Python para hacer esto?

kn3l
fuente

Respuestas:

119

Si el orden no es importante, debe utilizar set.difference. Sin embargo, si desea mantener el orden, basta con una simple comprensión de la lista.

result = [a for a in A if a not in subset_of_A]

EDITAR: Como dice delnan, el rendimiento mejorará sustancialmente si subset_of_Aes real set, ya que la verificación de la pertenencia a a setes O (1) en comparación con O (n) para una lista.

A = [6, 7, 8, 9, 10, 11, 12]
subset_of_A = set([6, 9, 12]) # the subset of A

result = [a for a in A if a not in subset_of_A]
Chinmay Kanchi
fuente
14
Y esto se puede mejorar enormemente haciendo subset_of_Auna prueba real set, que da O(1)membresía (en lugar de O(n)como con las listas).
55

Sí, la filterfunción:

filter(lambda x: x not in subset_of_A, A)
carlpett
fuente
8
Tenga en cuenta que en Python 2, filterdevuelve la lista en sí, mientras que en Python 3, devuelve un iterador.
modulitos
13
@modulitoslist(filter(...))
Paweł Kaczorowski
7

No, no hay una función incorporada en Python para hacer esto, porque simplemente:

set(A)- set(subset_of_A)

le dará la respuesta.

comer
fuente
1
Aunque esto funciona por su ejemplo, puede haber problemas si los elementos se repiten en la lista A.
Alok Mysore
6

set(A)-set(subset_of_A)le da el conjunto de resultados deseado, pero no conservará el orden original. Lo siguiente es preservar el orden:

[a for a in A if not a in subset_of_A]
Alexander Gessler
fuente
5

tuple(set([6, 7, 8, 9, 10, 11, 12]).difference([6, 9, 12]))

NPE
fuente
3

Qué tal si

set(A).difference(subset_of_A)
JoshAdel
fuente
3

Esto se preguntó hace un par de días (pero no puedo encontrarlo):

>>> A = [6, 7, 8, 9, 10, 11, 12]
>>> subset_of_A = set([6, 9, 12])
>>> [i for i in A if i not in subset_of_A]
[7, 8, 10, 11]

Podría ser mejor usar sets desde el principio, dependiendo del contexto. Luego, puede usar operaciones de configuración como muestran otras respuestas.

Sin embargo, convertir listas a conjuntos y viceversa solo para estas operaciones es más lento que la comprensión de listas.

Felix Kling
fuente
2

Utilice el Settipo:

A_set = Set([6,7,8,9,10,11,12])
subset_of_A_set = Set([6,9,12])

result = A_set - subset_of_A_set
Platino azur
fuente
1
>>> a = set([6, 7, 8, 9, 10, 11, 12])
>>> sub_a = set([6, 9, 12])
>>> a - sub_a
set([8, 10, 11, 7])
Jake
fuente
1
>>> A           = [6, 7, 8, 9, 10, 11, 12]
>>> subset_of_A  = [6, 9, 12];
>>> set(A) - set(subset_of_A)
set([8, 10, 11, 7])
>>> 
Andreas Jung
fuente