Python 2.7中使用tqdm遍历字典显示进度条的正确方法
解决Python 2.7中tqdm遍历字典时的进度条报错问题
你遇到的问题核心是tqdm的参数传递方式不正确。在Python 2.7适配的tqdm版本中,第二个位置参数并非用来指定迭代总长度,你需要通过**关键字参数total**来明确总次数。
正确的实现代码
from tqdm import tqdm d = {'k1':1, 'k2':2} for k, v in tqdm(d.items(), total=len(d)): print 'foo' a = 1 + 100 print 'bar'
为什么原来的列表写法能工作?
你之前遍历列表时用for i in tqdm(l, len(l))能正常运行,其实是个巧合:因为列表是可直接获取len()的可迭代对象,tqdm本身就能自动识别它的长度,即使你多传了一个长度参数,旧版本tqdm可能忽略了这个多余的位置参数,或者误打误撞适配了。但字典的items()在Python 2.7中虽然也返回列表,不过当你把长度作为第二个位置参数传递时,会和tqdm的其他位置参数(比如描述文本desc)冲突,最终导致报错。
更规范的写法其实可以省略total参数(只要可迭代对象能被tqdm自动获取长度),比如:
# 遍历列表的规范写法 for i in tqdm(l): # 执行操作 # 遍历字典的规范写法 for k, v in tqdm(d.items()): # 执行操作
不过如果遇到生成器这类无法自动获取长度的可迭代对象,就必须用total=xxx来指定总迭代次数。
内容的提问来源于stack exchange,提问作者Monica Heddneck
相关产品推荐
相关产品推荐

