Вы можете использовать set.issubset
со списком понимания, используя A[:]
будет изменен исходный/список объектов A:
A = [[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12]]
B = [12, 5]
st = set(B)
A [:] = [sub for sub in A if st.issubset(sub)]
print(A)
[[4, 5, 10, 12], [2, 5, 12, 13], [4, 5, 6, 12]]
То же самое для B = [13]
A = [[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12]]
B = [13]
st = set(B)
A [:] = [sub for sub in A if st.issubset(sub)]
print(A)
[[2, 5, 13, 14], [2, 5, 12, 13]]
set objects
s.issubset (т) ы теста < = т, является ли каждый элемент х в т
Для очень больших A или если у вас есть ограничения в отношении памяти, вы можете использовать выражение генератора:
A [:] = (sub for sub in A if st.issubset(sub))
Если заказ не имеет значения, и вы можете установить его, я бы предложил вам использовать их с самого начала. Выполнение поиска на наборах будет намного более эффективным.
Некоторые тайминги на несколько крупнее:
In [23]: A = [[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12],[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12],[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12]]
In [24]: B = [12, 5]
In [25]: timeit filter(lambda x: all(y in x for y in B), A)
100000 loops, best of 3: 9.45 µs per loop
In [26]: %%timeit
st = set(B)
[sub for sub in A if st.issubset(sub)]
....:
100000 loops, best of 3: 3.88 µs per loop
map(lambda x: not B_set-set(x), A)
In [27]: %%timeit
....: B_set = set(B)
....: map(lambda x: not B_set-set(x), A)
....:
100000 loops, best of 3: 6.95 µs per loop
Если вы уже были элементы хранятся в виде наборов в A:
In [33]: %%timeit
st = set(B)
[sub for sub in A if sub >= st]
....:
1000000 loops, best of 3: 1.12 µs per loop
Устраняют ли другие пользователи ответы? (не мой) –
@PedroLobito. Я не знаю, что вы имеете в виду? –
много ответов, в которых удалено по этому вопросу. –