2011-04-12 14 views
38

Por ejemplo, tengo dos listasfiltro de matriz en python?

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?

Respuesta

57

Si el pedido no es importante, debe usar set.difference. Sin embargo, si desea conservar el orden, una simple lista de comprensión es todo lo que necesita.

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

EDIT: Como dice delnan, el rendimiento se puede mejorar considerablemente si subset_of_A es un real set, ya que la comprobación de la pertenencia a un set es 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] 
+12

Y esto se puede mejorar enormemente al hacer 'subset_of_A' un verdadero' conjunto', que da 'O (1)' prueba de membresía (en lugar de 'O (n)' como con listas). – delnan

+0

Buen punto ..... –

2

¿Qué tal

set(A).difference(subset_of_A) 
20

Sí, la función filter:

filter(lambda x: x not in subset_of_A, A) 
+1

Tenga en cuenta que en Python 2, 'filter' devuelve la lista, mientras que en Python 3, devuelve un iterador. – modulitos

4

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

+0

Oh hombre, este tiene un voto por ser genial – deepelement

1
>>> a = set([6, 7, 8, 9, 10, 11, 12]) 
>>> sub_a = set([6, 9, 12]) 
>>> a - sub_a 
set([8, 10, 11, 7]) 
4

set(A)-set(subset_of_A) da a su conjunto de resultados previsto, pero no va a conservar el original orden. La siguiente es la preservación del orden:

[a for a in A if not a in subset_of_A] 
2

utilizar el tipo de Set:

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 
3

Esto fue sólo pidió 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] 

Se podría ser mejor usar set s desde el principio, dependiendo del contexto. Luego puede usar set operations como muestran otras respuestas.

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

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]) 
>>> 
5

No, no hay ninguna estructura en función en Python para hacer esto, porque simplemente:

set(A)- set(subset_of_A) 

le proporcionará la respuesta.

+0

Si bien esto funciona para su ejemplo, puede haber problemas si los elementos se repiten en la lista A. –