簡體   English   中英

滿足條件后重新啟動 python 中的嵌套循環

[英]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值才會被使用,這是一種浪費。

因此,您可以為2j 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM