2015-04-19 27 views
9

Tôi có hai danh sách:Làm cách nào để tìm hiểu xem các phần tử trong một danh sách có nằm trong một danh sách khác không?

A = [[2, 5, 13, 14], [4, 5, 10, 12], [2, 9, 10, 11], [2, 5, 12, 13], [4, 5, 6, 12]] 
B = [12, 5] 

Tôi đang cố gắng để tìm hiểu trong đó liệt kê trong A chứa các yếu tố trong B (thứ tự không quan trọng) và thoát khỏi phần còn lại của danh sách.

Trong trường hợp này câu trả lời là:

[[4, 5, 10, 12], [2, 5, 12, 13], [4, 5, 6, 12]] 

Nếu chúng ta thay đổi B và làm cho nó B = [13], câu trả lời sẽ là:

[[2, 5, 13, 14], [2, 5, 12, 13]] 

Trả lời

6

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 
+0

Đang xóa câu trả lời của người dùng khác? (không phải của tôi) –

+0

@PedroLobito. Tôi không hiểu ý bạn là gì? –

+0

nhiều câu trả lời bị xóa trong câu trả lời này. –

1

Bạn có thể sử dụng filter kết hợp với all đây:

print filter(lambda x: all(y in x for y in B), A) 

Câu trả lời hiệu quả hơn một chút:

B_set = set(B) 
print map(lambda x: not B_set-set(x), A) 
Các vấn đề liên quan