2013-07-29 43 views
6

Tôi có list1list2. list2 là một nhóm các từ mà phải được loại bỏ khỏi list1, ví dụ:xóa các phần tử trong một danh sách có trong danh sách khác

list1=['paste', 'text', 'text', 'here', 'here', 'here', 'my', 'i', 'i', 'me', 'me'] 

list2=["i","me"] 

mong muốn đầu ra:

list3=['paste', 'text', 'text', 'here', 'here', 'here', 'my'] 

Tôi đã thử các phiên bản khác nhau sử dụng 'cho' nhưng không có kết quả cho đến nay.

Bất kỳ ý tưởng nào cũng sẽ được đánh giá cao!

+1

Nice, rõ ràng, chứa và ngắn câu hỏi, theo kịp những câu hỏi tốt. – hetepeperfan

Trả lời

14

Sử dụng list comprehension:

>>> list1 = ['paste', 'text', 'text', 'here', 'here', 'here', 'my', 'i', 'i', 'me', 'me'] 
>>> list2 = ["i","me"] 
>>> list3 = [item for item in list1 if item not in list2] 
>>> list3 
['paste', 'text', 'text', 'here', 'here', 'here', 'my'] 

LƯU Ý: tra cứu trong danh sách là O(n), hãy xem xét thực hiện một set từ list2 thay - tra cứu trong bộ là O(1).

+2

Luôn sử dụng danh sách hiểu. Mặc dù đối với người mới sử dụng Python, tôi cảm thấy cần phải giải thích việc hiểu danh sách. –

+1

Lưu ý rằng chỉ với 2 mục, làm cho 'list2' thành' tuple' sẽ thực hiện một 'bộ' trong hầu hết các trường hợp ... –

+0

@JonClements như mọi khi, bình luận tuyệt vời, cảm ơn bạn! – alecxe

5

Điều gì về việc tận dụng bộ mỹ thuật thiết lập?

diff = set(list1) - set(list2) 
result = [o for o in list1 if o in diff] 

Hoặc thậm chí tốt hơn (hiệu quả hơn):

set2 = set(list2) 
result = [o for o in list1 if o not in set2] 
+1

Nó ít tốn kém hơn nhiều khi chỉ kiểm tra xem một phần tử của list1 (mà không làm cho nó một bộ) không có trong một bộ danh sách ... –

+0

Liệu việc loại bỏ các bản sao trong danh sách 1 trả cho chi phí thiết lập? Trong dữ liệu ví dụ có các mục lặp lại - vị trí hòa vốn có khả năng hiển thị ở đâu? – theodox

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