2013-08-26 45 views
9

Tôi đang cố gắng lọc danh sách, tôi muốn trích xuất từ ​​danh sách A (danh sách danh sách), các phần tử khớp với chỉ mục chính 0, với danh sách B khác những gì có một serie các giá trịPython: danh sách bộ lọc danh sách với một danh sách khác

như thế này

list_a = list(
    list(1, ...), 
    list(5, ...), 
    list(8, ...), 
    list(14, ...) 
) 

list_b = list(5, 8) 

return filter(lambda list_a: list_a[0] in list_b, list_a) 

nên quay lại:

list(
    list(5, ...), 
    list(8, ...) 
) 

làm thế nào tôi có thể làm điều này? Cảm ơn!

+1

Giải pháp của bạn hoạt động cho tôi nếu tôi sửa chữa các nhà thầu cho danh sách. (Gợi ý: sử dụng '[5,8]' thay vì 'danh sách (5,8)') – Kevin

Trả lời

17

Sử dụng một danh sách hiểu:

result = [x for x in list_a if x[0] in list_b] 

Đối với cải thiện hiệu suất chuyển đổi list_b đến một tập đầu tiên.

Khi @kevin ghi chú trong các nhận xét giống như list(5,8) (trừ khi nó không phải là mã giả) không hợp lệ và bạn sẽ gặp lỗi.

list() chấp nhận chỉ có một mục và mục mà nên iterable/iterator

+1

sử dụng tập hợp (cải thiện hiệu suất lớn) – debzsud

1

Bạn đang thực sự rất gần gũi. Chỉ cần làm điều này:

list_a = list(
    list(1, ...), 
    list(5, ...), 
    list(8, ...), 
    list(14, ...) 
) 

# Fix the syntax here 
list_b = [5, 8] 

return filter(lambda list_a: list_a[0] in list_b, list_a) 
+0

Nhận xét của bạn về việc thực hiện chức năng trước là sai: 'filter (lambda list_a:. .., list_a) 'sẽ làm chính xác điều tương tự, vì câu lệnh' lambda' được đánh giá xuống giá trị hàm trước khi được chuyển tới 'filter'. – Dougal

+0

@Dougal - Cảm ơn bạn. Tôi đã làm điều đó bởi vì, một thời gian trở lại, một người nào đó đã nói với tôi rằng nó đã tạo lại 'lambda' mỗi lần. Tôi nghĩ điều đó nghe có vẻ sai, nhưng cho rằng anh ấy biết nhiều hơn tôi và do đó đi theo lời khuyên của anh ấy. Hiển thị những gì bạn nhận được để không kiểm tra thông tin đôi ... – iCodez

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