首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tqdm进度条和zip内置的不能一起工作

tqdm进度条和zip内置的不能一起工作
EN

Stack Overflow用户
提问于 2016-12-16 02:41:47
回答 3查看 15.9K关注 0票数 38

tqdm是一个Python模块,可以方便地在控制台上打印一个动态更新的进度条。例如

代码语言:javascript
复制
from tqdm import tqdm
from time import sleep
for _ in tqdm(range(10)): 
    sleep(0.1) 

在迭代执行时,在控制台中打印1秒的动态进度条:

我还没有弄清楚如何将tqdm与内置zip对象一起使用。

这样做的用例是使用控制台进度条遍历两个相应的列表。

例如,我希望这是可行的:

代码语言:javascript
复制
for _, _ in tqdm(zip(range(10), range(10))):
    sleep(0.1)

但是在这种情况下,打印到控制台的进度条不正确:

一种解决方法是将tqdm与枚举一起使用,但是必须定义和管理迭代器索引。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-16 08:28:08

如果在zip调用中提供了total关键字参数,则tqdm可以与tqdm一起使用。

下面的示例演示了在使用total关键字参数的情况下,使用工作__tqdm__进度条对两个列表中的相应元素进行迭代:

问题是tqdm需要提前知道迭代器的长度。由于zip旨在处理不同长度的可迭代对象,因此它没有将单个长度的参数作为属性。

因此,__tqdm__仍然可以很好地与zip配合使用,您只需要为total关键字参数提供一点手动控制即可。

票数 63
EN

Stack Overflow用户

发布于 2019-01-26 06:51:20

使用tqdm>=4.42.0时,您应该执行以下操作:

代码语言:javascript
复制
from tqdm.contrib import tzip
from time import sleep

for _, _ in tzip(range(10), range(10)):
    sleep(0.1)

https://github.com/tqdm/tqdm#faq-and-known-issues中只需注意

  • 包装生成器:
    • 生成器包装函数倾向于隐藏可迭代的长度。tqdm不支持。
    • tqdm(enumerate(...))替换为enumerate(tqdm(...))tqdm(enumerate(x), total=len(x), ...)。这同样适用于带有numpy.ndenumerate.
    • Replace甚至zip(tqdm(a), tqdm(b)).
    • The的zip(tqdm(a), b) zip(tqdm(a), b)可以在tqdm.contrib.

下找到有用的便利功能

票数 20
EN

Stack Overflow用户

发布于 2016-12-16 03:13:09

因为你有一个进度条,你可以预测数据结构的长度。

range实现了hook method __len__,因此您可以通过执行内置的len来发现长度

代码语言:javascript
复制
>>> dir(range(10))
[ '__le__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index', 'start', 'step', 'stop']

>>> len(range(10))
10

但是,zip不提供猜测包装结构长度的方法,所以这可能是因为tqdm不能显示进度条。

代码语言:javascript
复制
dir(zip(range(10))) # no __len__ here
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

>>> len(zip(range(10)))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'zip' has no len()

编辑:

是的,就是这样。看看docs

...

包装枚举的迭代器:使用enumerate(tqdm(...))而不是tqdm(enumerate(...))。这同样适用于numpy.ndenumerate。这是因为enumerate函数倾向于隐藏可迭代的长度。tqdm不需要。

..。

使用with语句手动控制tqdm()更新:

使用tqdm(total=100)作为pbar: for i in range(10):pbar.update(10)

如果提供了可选变量len()**) (或使用迭代),则会显示预测统计信息。**

with也是可选的(您可以只将tqdm()赋给一个变量,但在这种情况下,不要忘记在末尾使用delclose()

对于范围(10)中的i,pbar = tqdm(total=100):pbar.update(10) pbar.close()

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41171191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档