Наприклад, у мене є два списки
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 вбудована функція для цього?
Відповіді:
Якщо порядок не важливий, вам слід скористатися 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]
Так, filterфункція:
filter(lambda x: x not in subset_of_A, A)
filterповертає сам список, тоді як у Python 3 він повертає ітератор.
list(filter(...))
Ні, у python для цього немає вбудованої функції, оскільки просто:
set(A)- set(subset_of_A)
надасть вам відповідь.
set(A)-set(subset_of_A)дає ваш запланований результат, але він не збереже початкового замовлення. Нижче наведено порядок збереження:
[a for a in A if not a in subset_of_A]
Це просто запитали пару днів тому (але я не можу його знайти):
>>> 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 з самого початку, залежно від контексту. Тоді ви можете використовувати набір операцій як інші відповіді.
Однак перетворення списків у набори та назад лише для цих операцій відбувається повільніше, ніж розуміння списку.
Використовуйте 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
>>> 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])
>>>
subset_of_Aсправжнійset, який даєO(1)тест на членство (замість того,O(n)як у списках).