[英]Restart nested loop in python after condition is met
我有兩個范圍: range_1 (0,10) range_2 (11, 40)
如果兩個范圍中的任何兩個元素的總和是偶數,我想從上面的兩個范圍(range_1 和 range_2)創建一個元組列表。
因此 range_1 中的 0 和 range_2 中的 12 = 12 是偶數,與 range_1 中的 1 和 range_2 中的 13 = 14 相同,這是偶數。
但是我不想 go 通過 range_2 中的所有元素。 只需要 5 次成功嘗試,然后我必須立即將 go 回到 range_1 中的第二次迭代。
因此對於第一次迭代:
(0, 12, 12), (0, 14, 14), (0, 16, 16), (0, 18, 18), (0, 20, 20)
然后我們 go 進行第二次迭代:
(1, 11, 12), (1, 13, 14), (1, 15, 16), (1, 17, 18), (1, 19, 20)
依此類推,直到 range_1 中的 9:
(9, 11, 20), (9, 13, 22), (9, 15, 24), (9, 17, 26), (9, 19, 28)
這是我的代碼,它遍歷了所有元素,這顯然是錯誤的,因為它遍歷了 range_2 中的所有元素!
list_1 = []
for i in range(10):
for j in range(11,40):
if (i+j)%2 == 0:
list_1.append((i, j, (i+j)))
只需存儲一個計數器,這樣如果達到 5 個,就可以跳出嵌套的 for 循環:
list_1 = []
for i in range(10):
counter = 0
for j in range(11,40):
if (i+j)%2 == 0:
list_1.append((i, j, (i+j)))
counter += 1
if counter == 5:
break
這給出了list_1
為:
[(0, 12, 12), (0, 14, 14), (0, 16, 16), (0, 18, 18), (0, 20, 20),
(1, 11, 12), (1, 13, 14), (1, 15, 16), (1, 17, 18), (1, 19, 20),
(2, 12, 14), (2, 14, 16), (2, 16, 18), (2, 18, 20), (2, 20, 22),
(3, 11, 14), (3, 13, 16), (3, 15, 18), (3, 17, 20), (3, 19, 22),
(4, 12, 16), (4, 14, 18), (4, 16, 20), (4, 18, 22), (4, 20, 24),
(5, 11, 16), (5, 13, 18), (5, 15, 20), (5, 17, 22), (5, 19, 24),
(6, 12, 18), (6, 14, 20), (6, 16, 22), (6, 18, 24), (6, 20, 26),
(7, 11, 18), (7, 13, 20), (7, 15, 22), (7, 17, 24), (7, 19, 26),
(8, 12, 20), (8, 14, 22), (8, 16, 24), (8, 18, 26), (8, 20, 28),
(9, 11, 20), (9, 13, 22), (9, 15, 24), (9, 17, 26), (9, 19, 28)]
應該注意的是,這不是 go 關於創建數據結構的最有效方法。 顯然,只有在內部 for 循環中生成的其他j
值才會被使用,這是一種浪費。
因此,您可以為2
的j
for 循環指定一個步驟,以便僅考慮其他j
值。 但是,您現在必須注意起始值。 如果您總是從11
開始並在2
秒內步進,那么您只會得到奇數j
值,並且如果i
是偶數,這些永遠不會與當前i
值結合以給出偶數。 因此,如果i
是偶數,則必須將j
for 循環更改為從12
開始,如果i
是奇數,則從11
開始。
如果您對創建范圍很聰明,則可以簡化算法。 使用一個step使范圍每隔j
跳過一次,根據i
是否為偶數調整開始,並將結束設置為 21,因為它只會變得那么高。
list_1 = []
for i in range(10):
start = 12 if i % 2 == 0 else 11
for j in range(start, 21, 2):
list_1.append((i, j, i+j))
print(list_1[-5:]) # For testing
output的前兩行:
[(0, 12, 12), (0, 14, 14), (0, 16, 16), (0, 18, 18), (0, 20, 20)]
[(1, 11, 12), (1, 13, 14), (1, 15, 16), (1, 17, 18), (1, 19, 20)]
正如其他人所評論的那樣,您可以通過構建適應您想要做的事情的范圍來簡化問題。 這是一個嵌套的理解:
[(i, j, i+j) for i in range(0, 10) for j in range((11 if i % 2 else 12), 21, 2)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.