filtr tablicy w Pythonie?

87

Na przykład mam dwie listy

 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 

Czy w Pythonie jest do tego wbudowana funkcja?

kn3l
źródło

Odpowiedzi:

122

Jeśli kolejność nie jest ważna, należy użyć set.difference. Jeśli jednak chcesz zachować porządek, wystarczy proste zrozumienie listy.

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

EDYCJA: Jak mówi delnan, wydajność zostanie znacznie poprawiona, jeśli subset_of_Ajest rzeczywista set, ponieważ sprawdzanie członkostwa w a setjest O (1) w porównaniu do O (n) dla listy.

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
źródło
14
Można to znacznie poprawić, tworząc subset_of_Aprawdziwy set, który daje O(1)test członkostwa (zamiast O(n)jak w przypadku list).
56

Tak, filterfunkcja:

filter(lambda x: x not in subset_of_A, A)
carlpett
źródło
8
Zauważ, że w Pythonie 2 filterzwraca samą listę, podczas gdy w Pythonie 3 zwraca iterator.
modulitos
16
@modulitoslist(filter(...))
Paweł Kaczorowski
7

Nie, w Pythonie nie ma wbudowanej funkcji, która mogłaby to zrobić, ponieważ po prostu:

set(A)- set(subset_of_A)

udzieli odpowiedzi.

jeść
źródło
1
Chociaż działa to na jego przykład, mogą wystąpić problemy, jeśli elementy zostaną powtórzone na liście A.
Alok Mysore
6

set(A)-set(subset_of_A)daje zamierzony zestaw wyników, ale nie zachowuje oryginalnej kolejności. Poniżej przedstawiono zachowanie kolejności:

[a for a in A if not a in subset_of_A]
Alexander Gessler
źródło
5

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

NPE
źródło
3

Co powiesz na

set(A).difference(subset_of_A)
JoshAdel
źródło
3

Zapytano o to kilka dni temu (ale nie mogę tego znaleźć):

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

W setzależności od kontekstu lepiej byłoby użyć s od początku. Następnie możesz użyć operacji na zestawach, tak jak pokazują inne odpowiedzi.

Jednak konwertowanie list na zbiory iz powrotem tylko dla tych operacji jest wolniejsze niż rozumienie list.

Felix Kling
źródło
2

Użyj Settypu:

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
Platinum Azure
źródło
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
źródło
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
źródło