2011-06-21 60 views
5

tôi muốn tìm giao điểm của hai danh sách trong python. tôi có cái gì đó trông như thế này:cắt hai danh sách từ trong python

>>> q = ['apple', 'peach', 'pear', 'watermelon', 'strawberry'] 
>>> w = ['pineapple', 'peach', 'watermelon', 'kiwi'] 

và tôi muốn tìm cái gì đó trông như thế này:

t = ['peach', 'watermelon'] 

tôi biết nó một cách đơn giản, câu hỏi nhưng im mới để trăn - không ai có bất kỳ đề xuất?

Trả lời

10

Phương thức intersection() có sẵn cho sets, có thể dễ dàng được tạo từ danh sách.

ETA: nếu bạn muốn có một danh sách ra khỏi nó ...

q = ['apple', 'peach', 'pear', 'watermelon', 'strawberry'] 
w = ['pineapple', 'peach', 'watermelon', 'kiwi'] 
t = list(set(q) & set(w)) 

Bây giờ t là:

['watermelon', 'peach'] 
+2

đánh bại tôi vào nó. Các bộ cũng làm việc với các toán tử nhị phân '|' (OR = union), '&' (AND = intersection) và '^' (XOR = trong một bộ nhưng không phải cả hai), do đó, điều này cũng sẽ trả lời: 't = set (q) & set (w) ' –

+1

Hah, bình luận của bạn được đăng như bản chỉnh sửa của tôi. Thật vui khi cố gắng loại ra các ví dụ trước khi ai đó thêm chúng. – Turnsole

+0

hoàn hảo! và có thể lưu danh sách giao nhau (mà tôi vô tình tạo thành một tập hợp) dưới dạng tệp csv không? @lazyr @Hydrangea – user808545

4

Cách ưa thích để làm việc đó là thông qua set intersection:

list(set(q) & set(w)) 

Nếu danh sách ngắn, list comprehension sẽ hoạt động.

t = [x for x in q if x in w] 

Tuy nhiên, hãy cẩn thận, đây là O(n^2), vì vậy nó không hiệu quả với danh sách dài.

+3

Giải pháp đọc danh sách có độ phức tạp bậc hai: 'lq * lw = O (n^2)' trong khi hoạt động thiết lập là tuyến tính '2lq + lw = O (n) 'với' lq' và 'lw' chiều dài của' danh sách q' và 'w' tương ứng. – GaretJax

+0

Tại sao lại là downvote? – Kimvais

+0

Do giải pháp dựa trên danh sách hiểu. – GaretJax

1

Nó đã được thảo luận ở đây trên SO rằng intersection hoạt động nhanh hơn một chút, vì vậy bạn có thể sử dụng:

q = ['apple', 'peach', 'pear', 'watermelon', 'strawberry'] 
w = ['pineapple', 'peach', 'watermelon', 'kiwi'] 
set(q).intersection(w) 
Các vấn đề liên quan