Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Progress bar with tqdm while iterating over the items in a python dictionary

If I'm trying to get a progress bar while iterating over a dict, how can I do this with tqdm? I'm using Python 2.7.

This works great with lists:

for i in tdqm(l, len(l):
    <do stuff>   

But fails over dicts:

for k, v in tqdm(d.items(), len(d)):
   <do stuff>

What's the proper way to do this with dicts?

Here's a real example:

d = {'k1':1, 'k2':2}
for k, v in tqdm(d.items(), len(d)):
    print 'foo'
    a = 1 + 100
    print 'bar'

I get:

-------------------------------------------------------------------
TypeError                         Traceback (most recent call last)
<ipython-input-30-7e4ce2b85414> in <module>()
      1 d = {'k1':1, 'k2':2}
----> 2 for k, v in tqdm(d.items(), len(d)):
      3     print 'oasdlkfj'
      4     a = 1 + 100
      5     print 'y'

/home/monica/anaconda2/envs/pytorch_p27/lib/python2.7/site-packages/tqdm/_tqdm.pyc in __init__(self, iterable, desc, total, leave, file, ncols, mininterval, maxinterval, miniters, ascii, disable, unit, unit_scale, dynamic_ncols, smoothing, bar_format, initial, position, postfix, unit_divisor, gui, **kwargs)
    810                 if self.pos:
    811                     self.moveto(self.pos)
--> 812                 self.sp(self.__repr__(elapsed=0))
    813                 if self.pos:
    814                     self.moveto(-self.pos)

/home/monica/anaconda2/envs/pytorch_p27/lib/python2.7/site-packages/tqdm/_tqdm.pyc in __repr__(self, elapsed)
    842             self.desc, self.ascii, self.unit,
    843             self.unit_scale, 1 / self.avg_time if self.avg_time else None,
--> 844             self.bar_format, self.postfix, self.unit_divisor)
    845 
    846     def __lt__(self, other):

/home/monica/anaconda2/envs/pytorch_p27/lib/python2.7/site-packages/tqdm/_tqdm.pyc in format_meter(n, total, elapsed, ncols, prefix, ascii, unit, unit_scale, rate, bar_format, postfix, unit_divisor)
    288             if prefix:
    289                 # old prefix setup work around
--> 290                 bool_prefix_colon_already = (prefix[-2:] == ": ")
    291                 l_bar = prefix if bool_prefix_colon_already else prefix + ": "
    292             else:

TypeError: 'int' object has no attribute '__getitem__'
like image 276
Monica Heddneck Avatar asked Apr 11 '18 18:04

Monica Heddneck


People also ask

Can you use tqdm with while loop?

To use an infinite loop with tqdm you need to change your while loop into an infinite for loop by utilizing a generator.

What is tqdm progress bar?

In Arabic, tqdm (taqadum) means progress, and it is used to create a smart progress bar for the loops. You just need to wrap tqdm on any iterable - tqdm(iterable).

How do you check the progress of a loop in Python?

Instead of printing out indices or other info at each iteration of your Python loops to see the progress, you can easily add a progress bar. wrap the object on which you iterate with pbar() . and it will display a progress that automatically updates itself after each iteration of the loop.


1 Answers

Your usage of tqdm is wrong. The second argument you're specifying is desc according to the documentation. You need to use a string as a second positional argument. If you want to use the total argument as second, you should pass it with its key like that: for k, v in tqdm.tqdm(d.items(),total=len(d)): So basically, it works as usual for dictionaries as for lists:

for k, v in tqdm.tqdm(d.items()): do stuff

You can then use optional arguments, refer to the link

like image 91
Jean Rostan Avatar answered Sep 19 '22 10:09

Jean Rostan