2016-01-11 55 views
5

Tôi biết nó là mã không hiệu quả và xấu xí, nhưng nếu tôi có ba vòng for, lồng vào nhau như vậy:Một số vòng lặp for 'vòng lặp', tiếp tục lặp lại vòng lặp bên ngoài nếu điều kiện bên trong vòng lặp bên trong là đúng

for x in range(0, 10): 
    for y in range(x+1, 11): 
     for z in range(y+1, 11): 
      if ... 

Tôi muốn ngắt hai vòng bên trong và tiếp tục lặp lại tiếp theo của vòng lặp ngoài nếu tuyên bố if là đúng. Điều này có thể được thực hiện?

+0

AFAIK người sáng lập Python từ chối thêm một cấu trúc để làm điều đó bởi vì mã sẽ trở thành xấu xí – wil93

+3

Có thể trùng lặp của [Làm thế nào để thoát ra khỏi nhiều vòng trong Python?] (http://stackoverflow.com/questions/189645/how-to-break-out-of-multiple-loops-in-python) – wil93

+1

bạn có thể viết nó bằng cách sử dụng các biến để lưu trữ trạng thái và kiểm tra mọi lúc bạn ngắt/kết thúc vòng lặp – beoliver

Trả lời

4

Kiểm tra một số biến sau mỗi vòng lặp kết thúc:

for x in range(0, 10): 
    for y in range(x+1, 11): 
     for z in range(y+1, 11): 
      if condition: 
       variable = True 
       break 
      #... 
     if variable: 
      break; 
     #... 
1
n = False 
for x in range(0,10): 
    if n == True: 
     print(x,y,z) 
    for y in range(x+1, 11): 
     if n == True: 
      break 
     for z in range(y+1, 11): 
      if z == 5: 
       n = True 
       break 

(1, 2, 5) 
(2, 2, 5) 
(3, 3, 5) 
(4, 4, 5) 
(5, 5, 5) 
(6, 6, 5) 
(7, 7, 5) 
(8, 8, 5) 
(9, 9, 5) 
2

Một lựa chọn khác là sử dụng ngoại lệ thay vì biến trạng thái:

class BreakException(Exception): 
    pass 

for x in range(0, 10): 
    try: 
     for y in range(x+1, 11): 
      for z in range(y+1, 11): 
       if True: 
        raise BreakException 
    except BreakException: 
     pass 

Tôi tưởng tượng này có thể đặc biệt hữu ích nếu giải cứu của hơn hai vòng trong.

0

Một giải pháp khả thi là để hợp nhất hai vòng bên trong để một trong những đơn (có thể được chấm dứt với break):

import itertools 

for x in range(10): 
    for y, z in itertools.combinations(range(x+1, 11), 2): 
     if condition: 
      break 
Các vấn đề liên quan