Làm cách nào để xóa một mục cụ thể khỏi vòng lặp danh sách trong python?

Kiểu dữ liệu Danh sách Python giúp bạn lưu trữ các mục thuộc các loại dữ liệu khác nhau theo trình tự có thứ tự. Dữ liệu được ghi bên trong dấu ngoặc vuông [[]] và các giá trị được phân tách bằng dấu phẩy [,]

Trong Python, có rất nhiều phương thức có sẵn trên kiểu dữ liệu danh sách giúp bạn loại bỏ một phần tử khỏi một danh sách nhất định. Các phương thức là remove[], pop[] và clear[]

Khi xóa các mục khỏi danh sách trong khi lặp qua cùng một danh sách, một giải pháp ngây thơ sử dụng

>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> [x for x in lst if x >= 6]
[6, 7, 8]
6 có thể khiến trình vòng lặp bỏ qua các phần tử

>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> for x in lst:
        if x < 6:
            lst.remove[x]

>>> lst
[2, 4, 6, 7, 8]

Lý do cho điều này là trình vòng lặp không biết rằng một phần tử danh sách đã bị xóa và vui vẻ chuyển sang mục tiếp theo

Trong ví dụ trên, trong lần lặp đầu tiên, iterator xem xét phần tử đầu tiên,

>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> [x for x in lst if x >= 6]
[6, 7, 8]
7. Trong thân vòng lặp,
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> [x for x in lst if x >= 6]
[6, 7, 8]
7 bị xóa khỏi danh sách, làm cho
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> [x for x in lst if x >= 6]
[6, 7, 8]
9 trở thành phần tử đầu tiên trong danh sách. Trình vòng lặp vẫn trỏ đến phần tử đầu tiên [nay là
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> [x for x in lst if x >= 6]
[6, 7, 8]
9]. Đối với lần lặp thứ hai, trình lặp bây giờ chuyển sang phần tử tiếp theo [phần tử thứ hai,
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> for x in reversed[lst]:
        if x < 6:
            lst.remove[x]

>>> lst
[6, 7, 8]
1], mặc dù phần tử đầu tiên mới [
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> [x for x in lst if x >= 6]
[6, 7, 8]
9] chưa bao giờ được xem xét. Vì vậy, giải pháp này bỏ qua các yếu tố

Hành vi này được giải thích đúng trong câu hỏi này

Giải pháp phổ biến cho việc này là sử dụng khả năng hiểu danh sách chỉ lọc danh sách nguồn

>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> [x for x in lst if x >= 6]
[6, 7, 8]

Một giải pháp khác là lặp lại ngược lại. Bằng cách đó, không có phần tử nào có thể bị bỏ qua vì việc xóa một mục khỏi danh sách sẽ chỉ ảnh hưởng đến chỉ mục của các phần tử đã được xử lý. Điều này có thể được thực hiện thủ công bằng cách sử dụng phép lặp dựa trên chỉ mục bắt đầu từ cuối hoặc sử dụng

>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> [x for x in lst if x >= 6]
[6, 7, 8]
1

>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> for x in reversed[lst]:
        if x < 6:
            lst.remove[x]

>>> lst
[6, 7, 8]

Cuối cùng, người ta cũng có thể lặp qua một bản sao của danh sách, vì vậy khi xóa các phần tử khỏi danh sách gốc, trình lặp không bị ảnh hưởng

Một cách tiếp cận rất đơn giản và không hiệu quả đối với vấn đề của chúng ta có thể là lặp qua danh sách và loại bỏ mục được yêu cầu theo điều kiện đã cho bằng cách sử dụng phương pháp

[1, 3, 5, 6, 7, 8, 9]
5. Chúng ta hãy xem tại sao sử dụng cách tiếp cận như vậy có thể gây hại cho mã của chúng ta

Thí dụ. Giả sử rằng chúng ta có một danh sách

[1, 3, 5, 6, 7, 8, 9]
6. Chúng tôi muốn xóa tất cả các mục nhỏ hơn 5. Bây giờ làm theo chương trình đưa ra dưới đây

li = list[range[10]]
for b in li:
    if b < 5:
        li.remove[b]
print[li]

'Đầu ra mong đợi' cho chương trình trên là

[1, 3, 5, 6, 7, 8, 9]
7. Tuy nhiên, kết quả mà chúng tôi thực sự nhận được lại khác hoàn toàn so với kỳ vọng

Sản lượng thực tế

[1, 3, 5, 6, 7, 8, 9]

Bây giờ, bạn có thể tự hỏi những gì vừa xảy ra? . Đừng lo lắng. Lý do khá đơn giản và rõ ràng khi bạn nhìn vào hình ảnh chính xác những gì đang xảy ra với mã của chúng tôi

Từ giải thích trên, chúng ta có thể suy luận rằng trình vòng lặp không biết gì về việc phần tử danh sách bị xóa và tiến tới mục tiếp theo mà không gặp bất kỳ rắc rối nào. Nhưng, ngay sau khi một phần tử bị xóa, nó sẽ được thay thế bằng phần tử tiếp theo

Ví dụ. Trong lần lặp đầu tiên, 0 bị xóa dựa trên điều kiện của chúng tôi và được thay thế bằng 1. Tuy nhiên, trình vòng lặp chuyển sang vị trí tiếp theo hiện giữ giá trị 2 thay vì 1. Điều này làm cho điều kiện của chương trình của chúng ta bị hiểu sai dẫn đến kết quả đầu ra sai

Bây giờ chúng ta đã có cái nhìn tổng quan về định nghĩa vấn đề, chúng ta hãy xem xét các giải pháp khả thi cho vấn đề của chúng ta

Đầu tiên, hãy bắt đầu với một cái nhìn tổng quan

Tập thể dục. Chạy mã. Là đầu ra giống nhau cho mỗi phương pháp?

Hãy đi sâu hơn vào từng phương pháp

Phương pháp 1. Sử dụng danh sách hiểu

Giải pháp đơn giản nhất cho vấn đề của chúng tôi là tạo một danh sách hiểu và sau đó lọc danh sách nguồn để lưu trữ các giá trị dựa trên điều kiện đã cho. Hiểu danh sách là một cách hiệu quả để tạo danh sách mới từ các danh sách/lặp lại khác

Chúng ta hãy xem chương trình sau đây để hiểu khái niệm

li = list[range[10]]
li[:] = [x for x in li if x >= 5]
print[li]

đầu ra

>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> [x for x in lst if x >= 6]
[6, 7, 8]
0

Chú ý. Tránh sử dụng cách hiểu danh sách quá dài để làm cho mã thân thiện với người dùng và cũng tránh sự phức tạp của mã

Phương pháp 2. Lặp lại đảo ngược

Một cách giải quyết khác cho vấn đề của chúng ta là một mẹo nhỏ. Thay vì lặp qua các mục thông thường, bạn có thể lặp qua các mục theo thứ tự ngược lại. Điều này sẽ đảm bảo rằng không có phần tử nào bị bỏ qua. Tự hỏi làm thế nào?

Điều này là do việc xóa một mục theo thứ tự ngược lại sẽ chỉ ảnh hưởng đến những mục đã được xử lý. Một danh sách có thể được đảo ngược bằng hàm

[1, 3, 5, 6, 7, 8, 9]
8. Chúng ta hãy xem đoạn mã sau để hiểu khái niệm này

>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> [x for x in lst if x >= 6]
[6, 7, 8]
2

đầu ra

>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> [x for x in lst if x >= 6]
[6, 7, 8]
0

Phương pháp 3. Sử dụng hàm Lambda

Sử dụng hàm lambda có thể phức tạp nhưng nó thường cung cấp các giải pháp nhanh chóng cho các vấn đề của chúng ta. Sức mạnh của hàm lambda cũng có thể được tận dụng trong trường hợp này

Ghi chú. Hàm

[1, 3, 5, 6, 7, 8, 9]
9 trong python có thể được sử dụng để chấp nhận hàm và danh sách làm đối số. Nó có thể được sử dụng để lọc ra các phần tử từ một chuỗi dựa trên chức năng

Chương trình sau đây minh họa cách chúng ta có thể sử dụng lambda để lặp qua danh sách dựa trên điều kiện của chúng ta

>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> [x for x in lst if x >= 6]
[6, 7, 8]
5

đầu ra

>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> [x for x in lst if x >= 6]
[6, 7, 8]
0

Phương pháp 4. Sử dụng Vòng lặp While để Bật và Nối các Mục

Một cách giải quyết khác cho vấn đề của chúng ta có thể là sử dụng vòng lặp while để lặp qua từng mục trong danh sách và trích xuất chúng ra khỏi danh sách thành từng biến một. Sau đó kiểm tra điều kiện trên từng mục và nối chúng vào danh sách khác cho phù hợp. Khi danh sách kết quả đã sẵn sàng, chúng ta có thể sao chép danh sách mới tạo vào danh sách gốc rồi xóa danh sách tạm thời [để tiết kiệm dung lượng bộ nhớ]

  • nhạc pop[]. phương thức
    [1, 3, 5, 6, 7, 8, 9]
    3 là một phương thức Python tích hợp được sử dụng để xóa một chỉ mục Python đã chỉ định. Nếu không có chỉ mục nào được cung cấp thì nó sẽ xóa mục cuối cùng khỏi danh sách
  • nối thêm []. phương thức
    [1, 3, 5, 6, 7, 8, 9]
    4 là một phương thức Python tích hợp được sử dụng để thêm một mục vào cuối danh sách hiện có mà không ảnh hưởng đến các mục đã có trước đó trong danh sách
  • xóa. the
    li = list[range[10]]
    li[:] = [x for x in li if x >= 5]
    print[li]
    2 từ khóa được sử dụng để xóa một chỉ mục cụ thể hoặc toàn bộ danh sách

Bây giờ chúng ta đã trải qua một số thuật ngữ cơ bản để giải quyết vấn đề của mình, chúng ta hãy xem chương trình sau để hiểu cách sử dụng khái niệm trên. [Vui lòng theo dõi các nhận xét để hiểu rõ hơn về mã. ]

>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> [x for x in lst if x >= 6]
[6, 7, 8]
0

đầu ra

>>> lst = [1, 2, 3, 4, 5, 6, 7, 8]
>>> [x for x in lst if x >= 6]
[6, 7, 8]
0

Sự kết luận

Từ cuộc thảo luận ở trên, chúng ta có thể nói rằng để lặp qua một danh sách đã cho và xóa các mục theo điều kiện đã cho một cách an toàn, chúng ta có thể sử dụng

  • hiểu danh sách hoặc
  • lặp lại ngược lại hoặc
  • một hàm lambda hoặc
  • một vòng lặp while chung sử dụng các hàm
    li = list[range[10]]
    li[:] = [x for x in li if x >= 5]
    print[li]
    3 và
    li = list[range[10]]
    li[:] = [x for x in li if x >= 5]
    print[li]
    4

Việc hiểu danh sách luôn là giải pháp tốt nhất khi so sánh với việc sử dụng hàm lọc vì hàm

li = list[range[10]]
li[:] = [x for x in li if x >= 5]
print[li]
5 hoặc
li = list[range[10]]
li[:] = [x for x in li if x >= 5]
print[li]
6 trong chương trình Python có thể nhanh hơn một chút trong các tình huống thông thường, nhưng khi được sử dụng với hàm lambda, hàm này luôn chậm hơn so với hàm

Tuy nhiên, bạn có thể tự do sử dụng bất kỳ tùy chọn nào phù hợp với nhu cầu của mình

Tôi hy vọng bạn thấy bài viết này hữu ích và nó giúp bạn lặp qua một danh sách và xóa các mục dựa trên một điều kiện nhất định. Hãy theo dõi để biết thêm các bài viết thú vị sắp tới trong tương lai

Đi đâu từ đây?

Đủ lý thuyết. Hãy thực hành một số

Các lập trình viên được trả sáu con số trở lên vì họ có thể giải quyết vấn đề hiệu quả hơn bằng cách sử dụng trí thông minh máy móc và tự động hóa

Để trở nên thành công hơn trong việc viết mã, hãy giải quyết nhiều vấn đề thực tế hơn cho người thực. Đó là cách bạn trau dồi những kỹ năng bạn thực sự cần trong thực tế. Rốt cuộc, việc sử dụng lý thuyết học tập mà không ai cần là gì?

Bạn xây dựng các kỹ năng mã hóa có giá trị cao bằng cách làm việc trên các dự án mã hóa thực tế

Bạn có muốn ngừng học với các dự án đồ chơi và tập trung vào các dự án mã thực tế giúp bạn kiếm tiền và giải quyết các vấn đề thực sự cho mọi người không?

🚀 Nếu câu trả lời của bạn là CÓ. , cân nhắc trở thành nhà phát triển Python tự do. Đó là cách tốt nhất để tiếp cận nhiệm vụ cải thiện kỹ năng Python của bạn—ngay cả khi bạn là người mới hoàn toàn

Nếu bạn chỉ muốn tìm hiểu về cơ hội làm việc tự do, vui lòng xem hội thảo trên web miễn phí của tôi “Cách xây dựng kỹ năng Python có thu nhập cao của bạn” và tìm hiểu cách tôi phát triển công việc viết mã trực tuyến của mình cũng như cách bạn có thể làm được—từ sự thoải mái của bạn

Tham gia hội thảo trên web miễn phí ngay bây giờ

Shubham Sayon

Tôi là một người tạo nội dung và Blogger Python chuyên nghiệp. Tôi đã xuất bản nhiều bài báo và tạo các khóa học trong một khoảng thời gian. Hiện tại tôi đang làm việc với tư cách là một freelancer toàn thời gian và tôi có kinh nghiệm trong các lĩnh vực như Python, AWS, DevOps và Networking

Chủ Đề