Làm cách nào để xóa phần tử khỏi danh sách nếu nó khớp với chuỗi con?Xóa một mục khỏi danh sách khớp với chuỗi con - Python
Tôi đã cố gắng loại bỏ một phần tử từ một danh sách bằng cách sử dụng pop()
và enumerate
phương pháp nhưng có vẻ như tôi đang thiếu một vài mặt hàng tiếp giáp mà cần phải được loại bỏ:
sents = ['@$\tthis sentences needs to be removed', 'this doesnt',
'@$\tthis sentences also needs to be removed',
'@$\tthis sentences must be removed', 'this shouldnt',
'# this needs to be removed', 'this isnt',
'# this must', 'this musnt']
for i, j in enumerate(sents):
if j[0:3] == "@$\t":
sents.pop(i)
continue
if j[0] == "#":
sents.pop(i)
for i in sents:
print i
Output:
this doesnt
@$ this sentences must be removed
this shouldnt
this isnt
#this should
this musnt
Đầu ra mong muốn:
this doesnt
this shouldnt
this isnt
this musnt
Trường hợp cổ điển trong việc xóa các mục khỏi danh sách trong khi bạn đang lặp qua danh sách đó. Đọc hàng tá câu hỏi Stack Overflow khác liên quan đến điều này. Ngoài ra, hãy xem [ghi chú trong tài liệu] (http://docs.python.org/reference/compound_stmts.html#for). –
bạn nên tránh thay đổi độ dài của vùng chứa trong khi lặp qua nó, đây là công thức cho thiên tai – wim
Nói chung, thường tốt hơn là tạo danh sách lọc mới thay vì cố sửa đổi danh sách tại chỗ. Các thuật toán không thay đổi luôn luôn dễ dàng hơn để lý luận thông qua (mặc dù không phải lúc nào cũng dễ dàng hơn để tìm ra cách viết). Khi bạn chỉ thay thế các giá trị, đôi khi hiệu quả của việc làm việc tại chỗ, nhưng khi bạn đang xóa hoặc chèn vào giữa danh sách, bạn thường nhận được hiệu quả _worse_ cùng với logic ít mạnh mẽ hơn. – abarnert