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]
您可以通过每次在内循环开始之前重置进度条对象来实现。
试试下面的代码来达到你想要的结果。
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)
输出:
请从@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)
请在下面找到输出:
这也是answer for the question on github
谢谢并致以最诚挚的问候
迈克尔
创建进度条时可以使用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)
感谢@michael-schroter 提醒我注意这一点,感谢@jaroslav-bezděk 提供原始 post。
我更喜欢@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
我在 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]
您可以通过每次在内循环开始之前重置进度条对象来实现。
试试下面的代码来达到你想要的结果。
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)
输出:
请从@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)
请在下面找到输出:
这也是answer for the question on github
谢谢并致以最诚挚的问候
迈克尔
创建进度条时可以使用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)
感谢@michael-schroter 提醒我注意这一点,感谢@jaroslav-bezděk 提供原始 post。
我更喜欢@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