2016-12-15 35 views
2

tqdmはコンソールに動的に更新するプログレスバーを簡単に印刷するためのPythonモジュールです。例えばtqdmプログレスバーとZIPビルトインは一緒に動作しません

from tqdm import tqdm 
from time import sleep 
for _ in tqdm(range(10)): 
    sleep(0.1) 

反復が実行されるように1秒のコンソールで動的プログレスバーを印刷するために: enter image description here

Iは、組み込みのZIPオブジェクトにtqdm使用する方法を考え出していません。
これは、コンソールプログレスバーを使用して2つの対応するリストを繰り返し使用する場合です。
例えば、私はこれが動作するように期待:

for _, _ in tqdm(zip(range(10), range(10))): 
    sleep(0.1) 

この場合にはコンソールに表示プログレスバーが正しくない: enter image description here

問題を回避するには、しかし、その後、列挙でtqdm使用することですイテレーター・インデックスを定義して管理する必要があります。

答えて

2

tqdmを一緒に使用することができますtqdm呼び出しで 'total'キーワード引数が指定されている場合はzipになります。

次の例では、2つのリストの対応する要素に対する反復処理をtqdm 'total'キーワード引数が使用されている場合のプログレスバー。 enter image description here

問題は、tqdmが事前にiterableの長さを知る必要があることです。 zipは異なる長さのiterableを処理するためのものであるため、引数として単一の長さの属性を持つわけではありません。

したがって、tqdmはzipでうまく動作しますが、 'total'キーワード引数を少し手動で制御する必要があります。

2

データ構造の長さを予測できるように、プログレスバーが必要です。

rangehook method__len__実装して、あなたがlen

>>> dir(range(10)) 
[ '__le__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index', 'start', 'step', 'stop'] 

>>> len(range(10)) 
10 

zipにビルトインやって長さを発見することができ、しかし、包まれた構造物の長さを推測する方法を提供していないので、おそらくそれが理由ですtqdmは進行状況バーを表示できないためです。

dir(zip(range(10))) # no __len__ here 
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__'] 

>>> len(zip(range(10))) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: object of type 'zip' has no len() 

編集:

ええ、それはそれです。 docs

...

ラッピング列挙反復可能オブジェクトを見て:代わりに tqdm(enumerate(...))enumerate(tqdm(...))を使用しています。 numpy.ndenumerateについても同様です。 enumerate関数はiterablesの長さを隠す傾向があるので、これは です。 tqdm はありません。 withステートメントを使用してtqdm()更新に

...

手動制御:

with tqdm(total=100) as pbar: 
    for i in range(10): 
     pbar.update(10) 

オプションの変数の合計(又はlen()有する反復可能)が 設けられ、予測の統計情報が表示されている場合。

with(あなただけの変数にtqdm()を割り当てることができますが、この場合 が終わりdelまたはclose()に忘れないようにもオプションである:

pbar = tqdm(total=100) 
for i in range(10): 
    pbar.update(10) 
pbar.close() 
+0

この投稿をいただきありがとうございます。これは、zipで動作するようにする 'total'キーワードを引数としてtqdmを初期化する方法を解明するのに役立ちました。 –

関連する問題