2012-05-19 30 views
37

phép nói rằng tôi có một danh sách a=[1,2,3] Và tôi muốn biết nếu ít nhất một trong các con số trong nó tồn tại trong danh sách khác, như thế này một: b=[4,5,6,7,8,1] Nói cách khác, tôi muốn biết nếu 1,2 hoặc 3 (các) tồn tại trong danh sách b. tôi bây giờ tôi có thể làm điều gì đó nhưmột lớp lót để kiểm tra xem có ít nhất một mục trong danh sách tồn tại trong danh sách khác không?

def func(a, b): 
    for i in a: 
     if i in b: 
      return True 
    return False 

Nhưng có thể là một cách để đưa rằng trong một dòng để làm cho mọi việc gọn gàng?

Trả lời

41

Có nhiều cách để thực hiện việc này. Bản dịch trực tiếp nhất là:

any_in = lambda a, b: any(i in b for i in a) 

Bạn cũng có thể sử dụng những thứ khác nhau liên quan đến bộ, chẳng hạn như:

any_in = lambda a, b: bool(set(a).intersection(b)) 

(mà phụ thuộc vào các yếu tố của a là hashable, nhưng nếu đó là sự thật, nó' có thể sẽ nhanh hơn để tạo một bộ lớn hơn trong số ab cho một trong các cách tiếp cận này).

Chỉnh sửa: isdisjoint tốt hơn intersection cho Python 2.6 trở lên, như được lưu ý bởi nhiều người bên dưới. Vui mừng khi biết về điều đó. :)

32

một đơn giản một-liner sẽ là:

any(i in b for i in a) 
+3

tốt nhất giải pháp pythonic – clg4

5

Bằng cách chuyển đổi danh sách của bạn để bộ bạn có thể thực hiện thiết lập hoạt động trên chúng. Nếu giao lộ lớn hơn 0, bạn có ít nhất một phần tử khớp với:

+0

Cùng ý tưởng, các biến thể khác: 'bool (set (a) & set (b))' hoặc đơn giản là 'set (a) & đặt (b) ' – johnP

2

Điều này sẽ hiệu quả.

def func(a, b): 
    return any([i in b for i in a]) 
52

Python 2.6 trở lên:

def func(a, b): 
    return not set(a).isdisjoint(b) 

Đối 2.4 hoặc 2.5:

def func(a, b): 
    return len(set(a).intersection(b)) != 0 

Đối 2.3 và dưới đây:

sudo apt-get update 
sudo apt-get upgrade 

;)

+9

upvote cho 2.3 trở xuống. đó là buồn cười: D ... câu trả lời đúng mặc dù – mkab

+4

Upvote cho LOLs –

11

Đây là số đặt vấn đề, không phải là một sự cố danh sách. Với kiểu dữ liệu đúng, câu trả lời thường là ngay lập tức rõ ràng :-)

def func(a, b): 
    return not set(a).isdisjoint(b) 
+0

người nói đó là một vấn đề thiết lập? Còn về '[a, a, a, b]' và '[a, a, b]'. Phần tử 'a' tồn tại trong danh sách đầu tiên, nhưng không tồn tại trong phần tử thứ hai. –

Các vấn đề liên quan