2012-07-05 44 views
22

Tôi đang cố gắng viết một đoạn mã có thể tự động tạo thành một biểu thức. Ví dụ: nếu tôi có hai danh sách [1,2,3,4] và [2,3,5], mã sẽ có thể tìm thấy các phần tử phổ biến trong hai danh sách, [2,3] và kết hợp phần còn lại của các phần tử trong một danh sách mới, là [1,4,5].Tìm các phần tử không phổ biến trong danh sách

Từ bài đăng này: How to find list intersection? tôi thấy rằng các yếu tố thông thường có thể được tìm thấy bằng cách

set([1,2,3,4]&set([2,3,5]). 

Có một cách dễ dàng để lấy yếu tố phi thường từ mỗi danh sách, trong ví dụ của tôi là [1,4 ] và [5]?

tôi có thể đi trước và làm một vòng lặp for:

lists = [[1,2,3,4],[2,3,5]] 
conCommon = [] 
common = [2,3] 
for elem in lists: 
    for elem in eachList: 
    if elem not in common: 
     nonCommon += elem 

Nhưng điều này dường như không cần thiết và không hiệu quả. Python có cung cấp bất kỳ chức năng tiện dụng nào có thể làm điều đó không? Cảm ơn trước!!

+0

bạn muốn có được danh sách riêng biệt như [1,4] và [5], hoặc một trong những đơn [1,4,5]? – nye17

Trả lời

40

Sử dụng các nhà điều hành khác biệt đối xứng cho set s (còn gọi là toán tử XOR):

>>> set([1,2,3])^set([3,4,5]) 
set([1, 2, 4, 5]) 
+0

oh wow thanks !! Bue mã trên có lượng thời gian tính toán và không gian bộ nhớ bằng nhau như được thiết lập ([1,2,3]) & bộ ([3,4,5]) không? Hoặc nó không có ảnh hưởng đáng kể đến hiệu năng mã? – turtlesoup

+0

Đây là cách hiệu quả nhất để đạt được mục tiêu của bạn. Độ phức tạp của nó là theo thứ tự như '&' (cụ thể là, tuyến tính trong số các phần tử trong các bộ). – Amber

12

Bạn có thể sử dụng Intersection khái niệm để đối phó với loại vấn đề.

b1 = [1,2,3,4,5,9,11,15] 
b2 = [4,5,6,7,8] 
set(b1).intersection(b2) 
Out[22]: {4, 5} 

Điều tốt nhất về việc sử dụng mã này là nó hoạt động khá nhanh cho dữ liệu lớn. Tôi có b1 với 607139 và b2 với 296029 yếu tố khi tôi sử dụng logic này tôi nhận được kết quả của tôi trong 2,9 giây.

0

Bạn có thể sử dụng phương thức thuộc tính .__xor__.

set([1,2,3,4]).__xor__(set([2,3,5])) 

hoặc

a = set([1,2,3,4]) 
b = set([2,3,5]) 
a.__xor__(b) 
Các vấn đề liên quan