Nếu bạn muốn có một giải pháp một liner (bỏ qua nhập khẩu) mà chỉ yêu cầu O(max(n, m))
làm việc cho các đầu vào có độ dài n
và m
, không O(n * m)
làm việc, bạn có thể làm như vậy với the itertools
module:
from itertools import filterfalse
main_list = list(filterfalse(set(list_1).__contains__, list_2))
này có lợi thế trong những chức năng chức năng tham gia một hàm callback về xây dựng ion, cho phép nó tạo ra các cuộc gọi lại một lần và tái sử dụng nó cho mọi phần tử mà không cần lưu trữ nó ở đâu đó (vì filterfalse
lưu trữ nó trong nội bộ); danh sách hiểu và biểu thức máy phát điện có thể làm điều này, nhưng nó xấu xí.†
Đó được kết quả tương tự trong một dòng duy nhất là:
main_list = [x for x in list_2 if x not in list_1]
với tốc độ:
set_1 = set(list_1)
main_list = [x for x in list_2 if x not in set_1]
Tất nhiên, nếu so sánh được dự định được vị trí, vì vậy:
list_1 = [1, 2, 3]
list_2 = [2, 3, 4]
phải xuất:
main_list = [2, 3, 4]
(vì giá trị trong list_2
có một trận đấu ở các chỉ số tương tự trong list_1
), bạn nên chắc chắn đi với Patrick's answer, trong đó bao gồm không list
s tạm thời hoặc set
s (ngay cả với set
s là khoảng O(1)
, họ có một cao hơn "hằng số" yếu tố trên mỗi séc so với kiểm tra bình đẳng đơn giản) và liên quan đến công việc O(min(n, m))
, ít hơn bất kỳ câu trả lời nào khác và nếu vấn đề của bạn nhạy cảm vị trí, chỉ là giải pháp đúng khi các yếu tố phù hợp xuất hiện ở vị trí không khớp.
†: Các cách để làm điều tương tự với một sự hiểu biết danh sách như một lớp lót sẽ được lạm dụng lồng looping để tạo và giá trị bộ nhớ cache (s) trong vòng lặp "ngoài cùng", ví dụ:
main_list = [x for set_1 in (set(list_1),) for x in list_2 if x not in set_1]
cũng cung cấp một lợi ích hiệu suất nhỏ trên Python 3 (vì bây giờ set_1
được kiểm tra cục bộ trong mã hiểu, thay vì tra cứu từ phạm vi lồng nhau cho mỗi kiểm tra; trên Python 2 không quan trọng, vì Python 2 không sử dụng các bao đóng để hiểu danh sách; chúng hoạt động trong cùng phạm vi mà chúng được sử dụng).
Bạn đang tìm kiếm các yếu tố trong 'list_2' xuất hiện nơi nào trong' list_1' hoặc các yếu tố trong 'list_2' không có trong cùng một chỉ mục trong' list_1'? –