【问题标题】:Python: How to replace tqdm progress bar by next one in nested loop?Python:如何在嵌套循环中用下一个替换 tqdm 进度条?
【发布时间】:2020-07-10 17:07:50
【问题描述】:

我在 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]

【问题讨论】:

    标签: python jupyter-notebook tqdm


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      您可以通过在每次内部循环开始之前重置进度条对象来实现这一点。

      尝试下面的代码来达到你想要的结果。

      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 感谢您的回答。我在下面添加了一些内容。谢谢和最好的问候
      【解决方案3】:

      创建进度条时可以使用 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)
      

      【讨论】:

      • 这将删除内部进度条并每次重新创建它。因此,如果在这些循环中完成了更多工作而不仅仅是睡眠,进度条将播放捉迷藏。
      • 解决方案有缺点,但我认为这是实现作者需要的更好方法。更少的代码更少的错误)
      • 非常感谢。这正是我想要的!
      • 不幸的是,这对 pandas 对象的 progress_apply 方法没有帮助。
      【解决方案4】:

      请从@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)
      

      请在下面找到输出:

      这也是answergithub上的问题的@

      感谢和最好的问候

      迈克尔

      【讨论】:

        猜你喜欢
        • 2021-02-19
        • 1970-01-01
        • 2018-01-30
        • 2019-04-17
        • 1970-01-01
        • 2022-07-28
        • 2018-10-12
        • 1970-01-01
        • 2019-01-24
        相关资源
        最近更新 更多