2013-02-16 39 views

Trả lời

16

Cách đơn giản nhất để làm điều này là sử dụng the sum() built-ingenerator expression:

def differences(a, b): 
    if len(a) != len(b): 
     raise ValueError("Lists of different length.") 
    return sum(i != j for i, j in zip(a, b)) 

Chúng tôi vòng qua danh sách với nhau sử dụng zip() và sau đó so sánh chúng. Dưới dạng True == 1False == 0, chúng tôi chỉ tính tổng số này để có được số khác biệt. Một lựa chọn khác là sử dụng phần có điều kiện của biểu thức trình tạo:

sum(1 for i, j in zip(a, b) if i != j) 

Tôi thực sự không thể nói tôi cảm thấy dễ đọc hơn người kia và nghi ngờ sẽ có sự khác biệt về hiệu suất.

+0

tôi thích rõ ràng '1 cho i ', thay vì boolean ngầm (dựa vào nó là' int'), nhưng anyway +1 (miễn là nó kiểm tra độ dài) –

+0

@JonClements Tôi đồng ý, và sau đó phần quan trọng (so sánh) được đẩy tới kết thúc của biểu thức, cảm thấy khó xử. Tôi tiếp tục thay đổi suy nghĩ của mình. –

-1

Bạn có thể sử dụng sets. Đúc cả hai vào một bộ, sau đó tìm sự khác biệt giữa hai. Ví dụ:

>>> a = [1,3,5,7,9] 
>>> b = [1,2,5,7,2] 
>>> len(set(a) - set(b)) 
2 

Điều này có thể được bao bọc trong chức năng kiểm tra sự khác biệt về độ dài trước.

+2

Điều này sẽ không hoạt động nếu có các yếu tố lặp lại và không tính đến đơn hàng. 'sự khác biệt ([1, 3, 5, 7, 9], [9, 7, 5, 3, 1])' sẽ là '0' trái với' 4'. Ví dụ của OP tính '3' là khác nhau, mặc dù nó tồn tại trong cả hai danh sách (nghĩa là, vị trí quan trọng). Điều này cũng bỏ qua khả năng các danh sách có độ dài khác nhau, như đã được đề cập trong câu hỏi. –

+0

Ah vâng, tôi đã bỏ lỡ 3 người cuối cùng và đã sử dụng 2 trong ví dụ của tôi. Lỗi của tôi! Tôi đã đề cập rằng một hàm có thể được sử dụng để kiểm tra sự khác biệt, theo mã ví dụ của bạn. – user2079098

1

giải pháp One-liner đó cũng tạo ra một lỗi nếu chiều dài không bằng:

>>> sum(map(lambda x,y: bool(x-y),a,b)) 
2 

Bây giờ thử đầu vào có độ dài khác nhau:

>>> sum(map(lambda x,y: bool(x-y),[1,2],[1])) 
TypeError 

Cách thức hoạt động: bool (x, y) trả về True nếu các phần tử khác nhau. Sau đó, chúng tôi ánh xạ chức năng này trên 2 danh sách và nhận danh sách [False, True, False, True, False].
Nếu chúng ta đưa vào bản đồ function() danh sách các độ dài khác nhau, chúng tôi nhận được TypeError

Cuối cùng, hàm sum() của danh sách này cung cấp cho boolean 2.

+0

Lưu ý rằng 'map()' và 'lambda' thường chậm hơn và ít có thể đọc được hơn biểu thức comp/generator list, và điều này sẽ chỉ làm việc cho các số. –

+0

có, chúng chậm hơn, nhưng mã ngắn hơn nhiều, nó phụ thuộc vào những gì cần thiết (phóng đại, cần tốc độ, không sử dụng python :)). Điều dễ đọc hơn là một vấn đề rất chủ quan. Bạn nói đúng rằng điều này không hoạt động trên các loại mà thao tác "-" không được xác định. –

+0

Cảm ơn một giải pháp khác.Tôi thích giải pháp của Lattyware vì cá nhân tôi cảm thấy dễ đọc hơn. Tôi không quen thuộc với chức năng 'lambda'. Ngoài ra với giải pháp của mình tôi có thể xác định các thông báo lỗi vì vậy tôi biết những gì tôi nhận được lỗi. – LWZ

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