2015-01-21 18 views
6

tôi cố gắng để tìm danh sách chung của giá trị cho ba danh sách khác nhau:Python: làm thế nào để tìm giá trị chung trong ba danh sách

a = [1,2,3,4] 
b = [2,3,4,5] 
c = [3,4,5,6] 

tất nhiên, tự nhiên tôi cố gắng sử dụng các nhà điều hành and tuy nhiên cách mà tôi chỉ nhận được giá trị cuối cùng list trong biểu:

>> a and b and c 
out: [3,4,5,6] 

là bất kỳ cách nào ngắn để tìm ra giá trị chung danh sách:

[3,4] 

Br

Trả lời

22

Sử dụng bộ:

>>> a = [1, 2, 3, 4] 
>>> b = [2, 3, 4, 5] 
>>> c = [3, 4, 5, 6] 
>>> set(a) & set(b) & set(c) 
{3, 4} 

Hoặc như Jon đề nghị:

>>> set(a).intersection(b, c) 
{3, 4} 

Sử dụng bộ đã lợi ích bạn không cần phải lặp lại nhiều lần danh sách gốc. Mỗi danh sách được lặp lại một lần để tạo các bộ, và sau đó các bộ được giao nhau.

Cách ngây thơ để giải quyết điều này bằng cách sử dụng tính năng đọc danh sách được lọc như Geotob đã làm sẽ lặp lại danh sách bc cho mỗi phần tử a, do đó danh sách dài hơn sẽ kém hiệu quả hơn nhiều.

+0

Đừng quên bật kết quả vào một danh sách nếu loại là quan trọng! – Kentzo

8
out = [x for x in a if x in b and x in c] 

là giải pháp nhanh chóng và đơn giản. Việc này tạo danh sách out với các mục nhập từ a, nếu các mục nhập đó nằm trong bc.

Đối với danh sách lớn hơn, bạn muốn xem xét các câu trả lời được cung cấp bởi @poke

+5

Tùy thuộc vào độ dài của danh sách, một giải pháp rất tốn kém ... – glglgl

0

Đối với những người vẫn còn ngại uppon câu hỏi này, với NumPy người ta có thể sử dụng:

np.intersect1d(array1, array2) 

này hoạt động với danh sách cũng như các mảng NumPy. Nó có thể được mở rộng đến nhiều mảng hơn với sự trợ giúp của functools.reduce hoặc đơn giản có thể được lặp lại cho một số mảng.

from functools import reduce 
reduce(np.intersect1d, (array1, array2, array3)) 

hoặc

new_array = np.intersect1d(array1, array2) 
np.intersect1d(new_array, array3) 
Các vấn đề liên quan