Lỗi khi thao tác xóa các phần tử trong list


Em chào các anh chị. Em mới tìm hiểu và học python cơ bản , em làm bài về xóa các phần tử chẵn trong list nhưng em gặp lỗi này em không hiểu sao bị vậy ạ. Mong được anh chị hướng dẫn

i chạy từ 0 đến độ dài list ban đầu - 1 mà bạn xóa phần tử thì độ dài giảm nên out of range :slight_smile:

Bài này dùng whilefor...in sẽ khóa điều kiện thoát lặp và bước lặp.

5 Likes

Cái này là lỗi thường gặp của người mới học, hồi bắt đầu học mình cũng bị.

Tức là bạn có một cái list là A, bạn duyệt (bằng for loop) qua từng item của A và đồng thời thêm/xoá phần tử trong lúc loop luôn.

Việc này sẽ làm thay đổi số lượng item đang có trong list trong lúc loop, dẫn tới vị trí (index) của các item sẽ bị thay đổi theo, nên sinh ra lỗi.

Ví dụ cho dễ hiểu như vầy, là có 10 cái ghế xếp thẳng hàng, bạn leo lên ghế để đi từ 1 cho tới 10.
Nhưng mới đi tới ghế số 6, bạn đưa giò chuẩn bị bước qua ghế số 7, thì có thằng nào đó chơi khôn, lấy cái ghế số 7 quăng đi chỗ khác, thế là bạn hụt giò, té dập mặt.

Để tránh lỗi này, nếu trường hợp cần phải xài loop “for”, thì bạn thêm 1 động tác là copy ra 1 list khác, và loop trên list mới copy đó, thay vì loop trên list chính

Còn không, thì xài while true, loop tới chừng nào hết thì thôi.

5 Likes

Em cảm ơn các anh đã hướng dẫn em. Em có làm lại với vòng lặp while nhưng vẫn bị lỗi ở len(arr) , em hiểu là sau khi xóa thì kích thước sẽ thay đổi nhưng khi gán 1 biến mới bằng kích thước để sử dụng cho vòng while vẫn bị lỗi , em mong được anh chị hướng dẫn em phần sai

Nếu là [2, 6] thì sẽ còn sót lại [6].

2 Likes

Viết vậy thì unpythonic rồi, bạn có thể sử dụng list-comprehension:

arr = [1,2,3,4]
filtered = [odd for odd in arr if odd % 2 !=0]

FYI: Singularity vẫn đang tuyển bạn LTV Python https://jobs.singularity.vn/13b9b34e-ac33-4858-a7e1-6530551937f3

2 Likes

Bạn có thể dùng phương thức append() vào một list khác để lưu các số lẻ thay vì xoá số chẵn đi.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?