Chúng ta đều biết rằng Python là một ngôn ngữ lập trình thanh lịch. Nhưng mọi thứ đều có điểm yếu. Đôi khi Python không thanh lịch như nó phải như vậy. Ví dụ, khi chúng ta cần thoát ra khỏi các vòng lặp lồng nhau như sau:Không thanh lịch như nó phải
Ảnh của Johannes Plenio trên unplash
for b in list_b:
if condition(a,b)…
Tôi có hai tệp được chọn theo tab và tôi cần kiểm tra từng hàng trong tệp đầu tiên so với tất cả các hàng trong tệp khác. Ví dụ,
file1:
row1 c1 36 345 A row2 c3 36 9949 B row3 c4 36 858 Cfile2:
row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563Giả sử tôi muốn xuất tất cả các hàng trong (file1) mà col [3] của File1 nhỏ hơn bất kỳ (không phải mọi) col [2] của File2, cho rằng col [1] là như nhau.
Đầu ra dự kiến:
row1 c1 36 345 A row2 c3 36 9949 BVì tôi đang làm việc ở Ubuntu, tôi muốn lệnh đầu vào trông như thế này: row1 c1 36 345 A
row2 c3 36 9949 B
row3 c4 36 858 C
9
row1 c1 36 345 A
row2 c3 36 9949 B
row3 c4 36 858 C
9
Tôi đã viết mã sau:
import sys filename1 = sys.argv[1] filename2 = sys.argv[2] file1 = open(filename1, 'r') file2 = open(filename2, 'r') done = False for x in file1.readlines(): col = x.strip().split() for y in file2.readlines(): col2 = y.strip().split() if col[1] == col2[1] and col[3] < col2[2]: done = True break else: continue print xTuy nhiên, đầu ra trông như thế này:
row2 c3 36 9949 BĐiều này thể hiện rõ đối với các bộ dữ liệu lớn hơn, nhưng về cơ bản tôi luôn nhận được hàng cuối cùng mà điều kiện trong vòng lặp lồng nhau là đúng. Tôi nghi ngờ rằng "phá vỡ" đang phá vỡ tôi ra khỏi cả hai vòng. Tôi muốn biết (1) làm thế nào để thoát ra khỏi một trong các vòng lặp và (2) nếu đây là vấn đề duy nhất tôi gặp phải ở đây.
Bài viết này mô tả cách thoát ra khỏi các vòng lặp lồng nhau trong Python.
- Cách viết các vòng lồng nhau trong Python
- Thoát khỏi các vòng lặp lồng nhau với row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 0 và row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 1
- Thoát ra khỏi các vòng lồng nhau với một biến cờ
- Tránh các vòng lặp lồng với row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 2
- So sánh tốc độ
Kết quả của việc đo thời gian thực hiện của mỗi cách với lệnh ma thuật row2 c3 36 9949 B 7 của máy tính xách tay Jupyter được hiển thị. Lưu ý rằng nó không thể được đo nếu được thực thi dưới dạng mã Python.
- Đo thời gian thực hiện với thời gian trong Python
Cách viết các vòng lồng nhau trong Python
Thoát khỏi các vòng lặp lồng nhau với row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 0 và row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 1
l1 = [1, 2, 3] l2 = [10, 20, 30] for i in l1: for j in l2: print(i, j) # 1 10 # 1 20 # 1 30 # 2 10 # 2 20 # 2 30 # 3 10 # 3 20 # 3 30
Thoát ra khỏi các vòng lồng nhau với một biến cờ
for i in l1: for j in l2: print(i, j) if i == 2 and j == 20 : print('BREAK') break # 1 10 # 1 20 # 1 30 # 2 10 # 2 20 # BREAK # 3 10 # 3 20 # 3 30
Thoát khỏi các vòng lặp lồng nhau với row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 0 và row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 1
Thoát ra khỏi các vòng lồng nhau với một biến cờ
- Đo thời gian thực hiện với thời gian trong Python
Xin lưu ý rằng kết quả sẽ khác nhau tùy thuộc vào số lượng phần tử và số lượng vòng lặp row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 3 được lồng.
for i in l1: for j in l2: print(i, j) if i == 2 and j == 20: print('BREAK') break else: continue break # 1 10 # 1 20 # 1 30 # 2 10 # 2 20 # BREAK
Lấy một vòng ba với 100 yếu tố làm ví dụ.
for i in l1: print('Start outer loop') for j in l2: print('--', i, j) if i == 2 and j == 20: print('-- BREAK inner loop') break else: print('-- Finish inner loop without BREAK') continue print('BREAK outer loop') break # Start outer loop # -- 1 10 # -- 1 20 # -- 1 30 # -- Finish inner loop without BREAK # Start outer loop # -- 2 10 # -- 2 20 # -- BREAK inner loop # BREAK outer loop
Sử dụng row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 0, row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 1 và thêm các biến cờ gần tương đương và row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 2 chậm.
Tuy nhiên, trong một số trường hợp, row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 2 phù hợp hơn vì nó cải thiện khả năng đọc của mã ngay cả khi nó chậm. Bạn nên sử dụng nó tùy thuộc vào tình huống.
Python có phá vỡ vòng lặp bên trong không?
Phá vỡ vòng bên trong chỉ bị phá vỡ trong vòng lặp bên trong! Vòng ngoài tiếp tục chạy.
row1 c1 36 345 A row2 c3 36 9949 B row3 c4 36 858 C 0
Thoát ra khỏi các vòng lồng nhau với một biến cờ
Tránh các vòng lặp lồng với row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 2
Xem bài viết sau đây để biết cách sử dụng cơ bản của vòng lặp row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 3 trong Python.
cho vòng lặp trong Python (với phạm vi, liệt kê, zip, v.v.)
Double-loop:
row1 c1 36 345 A row2 c3 36 9949 B row3 c4 36 858 C 1
Triple-loop:
row1 c1 36 345 A row2 c3 36 9949 B row3 c4 36 858 C 2
Bạn có thể tránh các vòng lồng nhau với row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 2.
- Sản phẩm của Danh sách Cartesian trong Python (itertools.product)
Bạn có thể sử dụng row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 2 để có được tất cả các kết hợp của nhiều danh sách trong một vòng lặp và nhận được kết quả tương tự như các vòng lặp lồng nhau.
row1 c1 36 345 A row2 c3 36 9949 B row3 c4 36 858 C 3
Vì nó là một vòng lặp duy nhất, bạn chỉ có thể row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 4 trong các điều kiện mong muốn.
row1 c1 36 345 A row2 c3 36 9949 B row3 c4 36 858 C 4
Thêm đối số của row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 2, bạn có thể thực hiện quy trình tương ứng với nhiều vòng lặp hơn.
row1 c1 36 345 A row2 c3 36 9949 B row3 c4 36 858 C 5
Ghi chú
Trong row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 2, quá trình cho phần tử luôn được thực hiện cho tất cả các kết hợp.
Trong ví dụ sau, phép nhân được thực hiện 9 lần cho cả row2 c3 36 9949 B 4 và row2 c3 36 9949 B 5.
row1 c1 36 345 A row2 c3 36 9949 B row3 c4 36 858 C 6
Trong trường hợp các vòng lặp lồng nhau, quá trình cho vòng lặp bên ngoài được thực hiện bởi số lượng các phần tử bên ngoài.
Trong ví dụ sau, phép nhân cho biến row2 c3 36 9949 B 4 chỉ là 3 lần.
row1 c1 36 345 A row2 c3 36 9949 B row3 c4 36 858 C 7
So sánh tốc độ
Kết quả của việc đo thời gian thực hiện của mỗi cách với lệnh ma thuật row2 c3 36 9949 B 7 của máy tính xách tay Jupyter được hiển thị. Lưu ý rằng nó không thể được đo nếu được thực thi dưới dạng mã Python.
- Đo thời gian thực hiện với thời gian trong Python
Xin lưu ý rằng kết quả sẽ khác nhau tùy thuộc vào số lượng phần tử và số lượng vòng lặp row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 3 được lồng.
Lấy một vòng ba với 100 yếu tố làm ví dụ.
row1 c1 36 345 A row2 c3 36 9949 B row3 c4 36 858 C 8
Sử dụng row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 0, row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 1 và thêm các biến cờ gần tương đương và row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 2 chậm.
Tuy nhiên, trong một số trường hợp, row1 c1 3455 3800 row2 c3 6784 7843 row3 c3 10564 99302 row4 c5 1405 1563 2 phù hợp hơn vì nó cải thiện khả năng đọc của mã ngay cả khi nó chậm. Bạn nên sử dụng nó tùy thuộc vào tình huống.