2015-06-17 14 views
6

Nếu tôi có một yếu tố đơn độc này rất dễ dàng:Làm cách nào để kiểm tra xem một phần tử từ Danh sách A có nằm trong Danh sách B bằng Python không?

 
>>> 3 not in [2, 3, 4] 
False 
>>> 3 not in [4, 5, 6] 
True 

Nhưng nếu tôi có hai danh sách và phải kiểm tra xem các yếu tố trong danh sách A xảy ra trong danh sách B?

A=[1,2,3,4] 
B=[4,5,6,7] 

Làm thế nào để có được một kết quả hiển thị với tôi rằng 1, 2, 3 đang không ở trong danh sách B?

+1

Câu hỏi này đã được hỏi một triệu lần. –

+0

có thể trùng lặp của [Tìm các phần tử không có trong danh sách] (http://stackoverflow.com/questions/2104305/finding-elements-not-in-a-list) –

Trả lời

1

Sử dụng danh sách hiểu:

câu trả lời truthy

any([True for x in [1, 2, 3, 4] if x in [4, 5, 6, 7]]) 

danh sách các yếu tố không có mặt trong danh sách thứ hai

[x for x in [1, 2, 3, 4] if x not in [4, 5, 6, 7]] 
+0

Vui lòng giải thích câu trả lời của bạn để người hỏi có thể hiểu cách nó hoạt động. – SuperBiasedMan

0

Đó là một trường hợp điển hình cho các hoạt động boolean trên bộ:

zerotonine = set(range(10)) 
fourtoten = set(range(4,11)) 
print "exclusively in one:", zerotonine^fourtoten 
exclusively in one: set([0, 1, 2, 3, 10]) 
4

nếu các mục trong danh sách là hashable:

>>> set(A) - set(B) 
{1, 2, 3} 

nếu không, bạn có thể sử dụng filter chức năng:

>>> list(filter(lambda a: a not in B, A)) 
[1, 2, 3] 

trong trường hợp đó, nếu Bsắp xếp, bạn có thể có được một tốt hơn hiệu suất bằng cách sử dụng bisect.bisect_left để tìm kiếm lôgarit:

>>> def pred(a): # if B is already *sorted* 
...  from bisect import bisect_left 
...  i = bisect_left(B, a) 
...  return i == len(B) or B[i] != a 
... 
>>> list(filter(pred, A)) 
[1, 2, 3] 
1

Bạn có thể sử dụng set.

ví dụ:

>>> a=[1,2,3,4] 
>>> b=[4,5,6,7] 
>>> list(set(a)-set(b)) 
[1, 2, 3] 
>>> 
3

Bạn cũng có thể sử dụng danh sách hiểu:

C=[i for i in A if i not in B] 

Output:

[1, 2, 3] 
1
set(A).difference(B) # set operation for difference between two collections A and B 
Các vấn đề liên quan