tqdm是一个Python模块,可以方便地在控制台上打印一个动态更新的进度条。例如
from tqdm import tqdm
from time import sleep
for _ in tqdm(range(10)):
sleep(0.1) 在迭代执行时,在控制台中打印1秒的动态进度条:

我还没有弄清楚如何将tqdm与内置zip对象一起使用。
这样做的用例是使用控制台进度条遍历两个相应的列表。
例如,我希望这是可行的:
for _, _ in tqdm(zip(range(10), range(10))):
sleep(0.1)但是在这种情况下,打印到控制台的进度条不正确:

一种解决方法是将tqdm与枚举一起使用,但是必须定义和管理迭代器索引。
发布于 2016-12-16 08:28:08
如果在zip调用中提供了total关键字参数,则tqdm可以与tqdm一起使用。
下面的示例演示了在使用total关键字参数的情况下,使用工作__tqdm__进度条对两个列表中的相应元素进行迭代:

问题是tqdm需要提前知道迭代器的长度。由于zip旨在处理不同长度的可迭代对象,因此它没有将单个长度的参数作为属性。
因此,__tqdm__仍然可以很好地与zip配合使用,您只需要为total关键字参数提供一点手动控制即可。
发布于 2019-01-26 06:51:20
使用tqdm>=4.42.0时,您应该执行以下操作:
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.zip(tqdm(a), tqdm(b)).zip(tqdm(a), b) zip(tqdm(a), b)可以在tqdm.contrib.下找到有用的便利功能
发布于 2016-12-16 03:13:09
因为你有一个进度条,你可以预测数据结构的长度。
range实现了hook method __len__,因此您可以通过执行内置的len来发现长度
>>> 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不能显示进度条。
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()赋给一个变量,但在这种情况下,不要忘记在末尾使用del或close():
对于范围(10)中的i,pbar = tqdm(total=100):pbar.update(10) pbar.close()
https://stackoverflow.com/questions/41171191
复制相似问题