фільтр масиву в python?


85

Наприклад, у мене є два списки

 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 

Чи є в Python вбудована функція для цього?

Відповіді:


119

Якщо порядок не важливий, вам слід скористатися set.difference. Однак, якщо ви хочете зберегти порядок, достатньо простого розуміння списку.

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

EDIT: Як каже Делнан, продуктивність буде значно покращена, якщо subset_of_Aвона є фактичною set, оскільки перевірка членства в a setє O (1) порівняно з O (n) для списку.

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]

14
І це можна значно покращити, зробивши subset_of_Aсправжній set, який дає O(1)тест на членство (замість того, O(n)як у списках).


7

Ні, у python для цього немає вбудованої функції, оскільки просто:

set(A)- set(subset_of_A)

надасть вам відповідь.


1
Хоча це працює для його прикладу, можуть виникнути проблеми, якщо елементи повторюються у списку А.
Алок Майсур

6

set(A)-set(subset_of_A)дає ваш запланований результат, але він не збереже початкового замовлення. Нижче наведено порядок збереження:

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



3

Це просто запитали пару днів тому (але я не можу його знайти):

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

Можливо, краще використовувати sets з самого початку, залежно від контексту. Тоді ви можете використовувати набір операцій як інші відповіді.

Однак перетворення списків у набори та назад лише для цих операцій відбувається повільніше, ніж розуміння списку.



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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.