簡體   English   中英

Python:如何用嵌套循環中的下一個替換 tqdm 進度條?

[英]Python: How to replace tqdm progress bar by next one in nested loop?

我在 Jupyter Notebook 中使用tqdm模塊。 假設我有以下帶有嵌套 for 循環的代碼。

import time
from tqdm.notebook import tqdm

for i in tqdm(range(3)):
    for j in tqdm(range(5)):
        time.sleep(1)

輸出如下所示:

100%|██████████| 3/3 [00:15<00:00, 5.07s/it]
100%|██████████| 5/5 [00:10<00:00, 2.02s/it]

100%|██████████| 5/5 [00:05<00:00, 1.01s/it]

100%|██████████| 5/5 [00:05<00:00, 1.01s/it]

有沒有什么選項,如何在運行過程中只顯示當前的j進度條? 那么,完成迭代后的最終輸出會是這樣嗎?

100%|██████████| 3/3 [00:15<00:00, 5.07s/it]
100%|██████████| 5/5 [00:05<00:00, 1.01s/it]

創建進度條時可以使用 leave 參數。 像這樣的東西:

import time
from tqdm import tqdm

for i in tqdm(range(3)):
    for j in tqdm(range(5), leave=bool(i == 2)):
        time.sleep(1)

您可以通過每次在內循環開始之前重置進度條對象來實現此目的。

試試下面的代碼來達到你想要的結果。

import time
from tqdm.notebook import tqdm

#initializing progress bar objects
outer_loop=tqdm(range(3))
inner_loop=tqdm(range(5))

for i in range(len(outer_loop)):
    inner_loop.refresh()  #force print final state
    inner_loop.reset()  #reuse bar
    outer_loop.update() #update outer tqdm

    for j in range(len(inner_loop)):
        inner_loop.update() #update inner tqdm
        time.sleep(1)

輸出:

輸出

感謝@michael-schroter 引起我的注意,感謝@jaroslav-bezděk 提供原始帖子。

我更喜歡@anton-pomieshchenko 的回答。 但是,如前所述,每次外部條更新時,內部條都會不斷消失並重新出現,如果它快速且頻繁地發生,這可能看起來很糟糕。

正確答案(假設您不需要重新使用外條,但確實想重新使用內條):

from time import sleep
from tqdm.auto import tqdm

with tqdm(range(3)) as outer:
    inner_total = 3
    with tqdm(total=inner_total) as inner:
        for i in outer:
            inner.reset(inner_total)  # reinitialise without clearing
            for j in range(inner_total):
                sleep(1)
                inner.update()
            inner.refresh()  # print last state without clearing

請從@hamza-khurshid 找到三個循環的修改后的答案。

import time
from tqdm.auto import tqdm

#initializing progress bar objects
outer_loop=tqdm(range(3))
mid_loop=tqdm(range(5))
inner_loop=tqdm(range(7))


for i in range(len(outer_loop)):

    mid_loop.refresh()  #force print final state
    mid_loop.reset()  #reuse bar
    outer_loop.update() #update outer tqdm

    for j in range(len(mid_loop)):
        inner_loop.refresh()  #force print final state
        inner_loop.reset()  #reuse bar
        mid_loop.update()  ##update mid tqdm

        for k in range(len(inner_loop)):
            inner_loop.update() #update inner tqdm
            time.sleep(1)
print(i,j,k)

請在下面找到輸出:

在此處輸入圖片說明

這也是github上問題的 答案

感謝和最好的問候

邁克爾

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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