Python xóa khỏi danh sách trong khi lặp lại

Nói chung, không nên xóa các mục khỏi danh sách trong khi lặp lại danh sách đó vì nó có thể gây ra hành vi không mong muốn. Thay vào đó, bạn có thể tạo một danh sách mới chỉ chứa các mục bạn muốn giữ lại hoặc bạn có thể sử dụng vòng lặp for với nhiều chỉ mục để lặp qua danh sách và xóa các mục theo chỉ mục. Một tùy chọn khác là sử dụng biểu thức hiểu danh sách hoặc trình tạo để lọc ra các mục không mong muốn

Đây là một ví dụ về việc tạo một danh sách mới

Đây là một ví dụ về việc sử dụng một loạt các chỉ số để loại bỏ các mục

Điều quan trọng cần lưu ý là trong phiên bản python 3. 3 trở lên, các vòng lặp for trong python tạo một trình vòng lặp bên trong đầu vào. Vì vậy, trong trăn 3. 3 trở lên, những điều sau đây sẽ tăng RuntimeError: dictionary changed size during iteration

for i in original_list:
    if i%2 !=0:
        original_list.remove(i)

Bạn có thể sử dụng biểu thức hiểu danh sách hoặc trình tạo để xóa các mục không mong muốn như được hiển thị ở trên

Không nên xóa các mục khỏi danh sách trong một vòng lặp vì điều này có thể khiến danh sách bỏ qua một vài mục và dẫn đến đầu ra không chính xác. Điều này xảy ra vì việc xóa các mục khỏi danh sách trong khi lặp lại sẽ thay đổi chỉ mục và độ dài của nó

1

2

3

4

5

6

7

8

9

if __name__ == '__main__'.

 

    nums = [1, 2, 3, 4, 5]

 

    cho x in num:

        số. xóa(x)

 

    in(nums)

 

Tải xuống Chạy mã

 
Bài đăng này cung cấp tổng quan về một số lựa chọn thay thế có sẵn để tránh hành vi không xác định này

1. Sử dụng danh sách hiểu

Bạn có thể sử dụng khả năng hiểu danh sách để tạo danh sách mới chỉ chứa các mục mong muốn

1

2

3

4

5

6

7

if __name__ == '__main__'.

 

    nums = [1, 2, 3, 4, 5]

 

    lẻ = [x for x in nums if x & 1]

    in(lẻ)

 

Tải xuống Chạy mã

 
Điều này hoạt động tốt. Tuy nhiên, nó không sửa đổi danh sách đầu vào tại chỗ mà thay vào đó tạo một danh sách mới. Điều này có thể gây ra sự cố khi có các tham chiếu khác đến danh sách cần cập nhật. May mắn thay, trong Python, bạn có thể chỉ cần thay đổi danh sách tại chỗ bằng cách gán cho lát cắt [:]

1

2

3

4

5

6

7

if __name__ == '__main__'.

 

    nums = [1, 2, 3, 4, 5]

 

    nums[. ] = [x cho x in nums if x & 1]

    in(nums)

 

Tải xuống Chạy mã

2. Sử dụng mô-đun itertools

Trong Python 3, bạn cũng có thể sử dụng mô-đun thay vì hiểu danh sách. Nó có một hàm filterfalse(), dùng để lọc các phần tử từ danh sách có vị từ là False.

1

2

3

4

5

6

7

8

9

10

11

12

từ itertools nhập filterfalse

 

def iseven(x):

    return x & 1 == 0

 

if __name__ == '__main__'.

 

    nums = [1, 2, 3, 4, 5]

 

    nums[. ] = filterfalse(iseven, nums)

    in(nums)

 

Tải xuống Chạy mã

3. Tạo bản sao của danh sách

Ở đây, ý tưởng là lặp lại một bản sao của danh sách và sau đó sửa đổi danh sách ban đầu theo yêu cầu. Đây là một ví dụ làm việc

1

2

3

4

5

6

7

8

9

10

if __name__ == '__main__'.

 

    nums = [1, 2, 3, 4, 5]

 

    cho x trong danh sách(nums):

        nếu x & 1 == 0:

            nums. xóa(x)

 

    in(nums)

 

Tải xuống Chạy mã

4. Lặp lại ngược

Một cách hợp lý khác là lặp lại danh sách và xóa các phần tử khỏi danh sách. Bằng cách này, không có gì bị bỏ qua. Cách tiếp cận này có một lợi thế lớn so với các cách tiếp cận khác vì nó không tạo ra bất kỳ bản sao nào của danh sách và thực hiện công việc chỉ trong một lần và tại chỗ

Làm cách nào để xóa một phần tử khỏi danh sách trong Python bằng vòng lặp while?

Cách xóa phần tử trong Danh sách Python khi đang lặp .
a = [1, 2, 2, 3, 4] def even(x): return x % 2 == 0..
a = [x cho x trong a nếu không chẵn(x)] # --> a = [1, 3]
Một[. ] = [x cho x trong a nếu không chẵn(x)] # --> a = [1, 3]
từ itertools nhập filterfalse a[. ] = filterfalse(even, a) # --> a = [1, 3]

Chúng tôi có thể xóa phần tử khỏi danh sách trong khi lặp lại không?

Xóa phần tử bằng Single Iterator . Loại bỏ các phần tử liên quan đến giá trị hoặc chỉ mục có thể được thực hiện bằng phương pháp này. we can use an iterator to iterate over the list, and while traversing we can remove the elements we want to remove. Removing elements with respect to value or index can be done using this method.