【Python】tqdmでリストの長さを途中変更する場合の書き方

記事内に広告が含まれています。
スポンサーリンク

リストの長さを変更するとおかしくなる

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に新しい長さを代入することで反映出来ます。

これで長さを変更した場合でも、プログレスバーが正しく表示されます。

コメント

タイトルとURLをコピーしました