链式迭代的 tqdm 进度条

tqdm progress bar for chained iterables

如果我想在 Python 中组合两个迭代器,一种方法是使用 itertools.chain.

例如,如果我有两个范围 range(50, 100, 10)range(95, 101),我可以得到范围 [50, 60, 70, 80, 90, 95, 96, 97, 98, 99, 100]itertools.chain(range(50, 100, 10), range(95, 101))

tqdm是Python中的可扩展进度条。但是,默认情况下它似乎无法计算 itertools.chain 表达式中的项目数,即使它们是固定的。

一种解决方案是将范围转换为列表。但是,这种方法无法扩展。

有没有办法确保 tqdm 理解链式迭代器?

from tqdm import tqdm
import itertools
import time

# shows progress bar
for i in tqdm(range(50, 100, 10)):
    time.sleep(1)
   
# does not know number of items, does not show full progress bar
for i in tqdm(itertools.chain(range(50, 100, 10), range(95, 101))):
    time.sleep(1)
    
# works, but doesn't scale
my_range = [*itertools.chain(range(50, 100, 10), range(95, 101))]    
for i in tqdm(my_range):
    time.sleep(1)

这更像是一种解决方法,而不是答案,因为看起来 tqdm 现在无法处理它。但是你可以只找到你链接在一起的两个东西的长度,然后在调用 tqdm.

时包含参数 total=
from tqdm import tqdm
from itertools import chain

# I started with a list of iterables
iterables = [iterable1, iterable2, ...]

# Get the length of each iterable and then sum them all
total_len = sum([len(i) for i in iterables])

# Then chain them together
main_iterable = chain(*iterables)

# And finally, run it through tqdm
# Make sure to use the `total=` argument
for thing in tqdm(main_iterable, total=total_len):
    # Do stuff