リストの長さを変更するとおかしくなる
from tqdm import tqdm
from time import sleep
# このプログラムは無限ループします. 実行の際はご注意下さい.
a = list(range(10))
for i in tqdm(a):
sleep(0.5)
if i > 5:
a.append(10)
上のプログラムでは、i>5の時にループ元のリストにappendする操作を行っています。
このように、for文の途中でリストにappendするなどして長さが変更された場合、tqdmは意図しない動作になります。(上の場合だと途中でプログレスバーが消えます)
tqdmはループ開始時にリストの長さを取得するため、途中で追加した分が反映されないためです。
解決策
from tqdm import tqdm
from time import sleep
# このプログラムは無限ループします. 実行の際はご注意下さい.
a = list(range(10))
with tqdm(total=len(a)) as tq:
for i in a:
tq.update(1) # カウントを進める
sleep(0.5)
if i > 5:
a.append(10)
tq.total = len(a) # 新しいリストの長さを反映させる
上のようにすることで、途中で長さを変更しても正しく動作させることができます。
update()でtqdmのカウントを手動で進める事が出来ます。上のプログラムでは1ずつ進めています。
appendした後はtotalに新しい長さを代入することで反映出来ます。
これで長さを変更した場合でも、プログレスバーが正しく表示されます。
コメント