Bạn có thể sử dụng set.issubset
với một sự hiểu biết danh sách, sử dụng A[:]
sẽ thay đổi đối tượng gốc/danh sách 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]]
Tương tự cho 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 (t) s kiểm tra < = t dù mọi phần tử trong s là trong t
Đối với rất lớn A hoặc nếu bạn có hạn chế về bộ nhớ, bạn có thể sử dụng biểu thức trình tạo:
A [:] = (sub for sub in A if st.issubset(sub))
Nếu đơn đặt hàng không bao giờ quan trọng và có thể đặt tôi sẽ đề nghị bạn sử dụng chúng ngay từ đầu. Việc tra cứu trên các bộ sẽ hiệu quả hơn rất nhiều.
Một số timings trên Một lớn hơn một chút:
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
Nếu bạn đã có các yếu tố được lưu trữ như bộ trong 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
Đang xóa câu trả lời của người dùng khác? (không phải của tôi) –
@PedroLobito. Tôi không hiểu ý bạn là gì? –
nhiều câu trả lời bị xóa trong câu trả lời này. –