3

私はこのループに対するよりエレガントな解決策を探しています。私の両端キューは動的に作成され、長さはさまざまです。以下の例では、リストの長さは2アイテムのみで、最大3アイテムになる可能性があります。私のアプリケーションでは、リストの長さは最大30アイテムです。したがって、多くのifステートメントを記述せず、dequeが空になるとコードの実行を停止させたいと思います。

from collections import deque

my_list = [ 1,2 ]
my_deque = deque ( my_list )

while my_deque:
    alpha = my_deque.popleft()
    beta = my_deque.popleft()
    gamma = my_deque.popleft()

上記のコードは3つのコマンドすべてを実行し、gammaコマンドで「IndexError:pop fromaemptydeque」を返します。このエラーが発生している理由は理解していますが、whileループ(または長いリストをループする別の創造的な方法)の途中でリスト/両端キューが空かどうかを評価するために欠けているトリックがあるかどうかを知りたいです。

助けてくれてありがとう。

4

3 に答える 3

5

whileループですでに行っているのとまったく同じ方法でチェックインできます。

while my_deque:
    alpha = my_deque.popleft()
    beta = my_deque.popleft() if my_deque else None
    gamma = my_deque.popleft() if my_deque else None

ただし、が1つの作業単位を構成する場合はalpha、それらを1つのタプルに結合し、それをキューに入れる方がよい場合があります。betagamma

于 2013-03-01T08:11:22.423 に答える
5

IndexErrorをキャッチできます。

try:
    while mydeque:
        alpha = mydeque.popleft()
        beta = mydeque.popleft()
        gamma = mydeque.popleft()
except IndexError:
    # handle empty mydeque

あなたは何をしようとしているのですか?mydequeが空であることを確認したいのはなぜですか?

于 2013-03-01T08:12:05.877 に答える
0

キューからポップするアイテムの数が進んでいるかどうかがわかっている場合は、少なくともその数の準備ができていることをループに条件付けることができます。

while len(my_deque) >= 3:
    alpha = my_deque.popleft()
    beta = my_deque.popleft()
    gamma = my_deque.popleft()

    # do stuff with alpha/beta/gamma here

要求される可能性のあるアイテムの数がわからない場合は、「許可よりも許しを求める方が簡単」なアプローチを取り、無条件にループすることができます。

while True:
    try:
        alpha = my_deque.popleft()
        if alpha > 0:
            beta = my_deque.popleft()
            gamma = my_deque.popleft()
        else:
            beta = 0
            gamma = 0
    except IndexError:
        break

    # do stuff with alpha/beta/gamma here

ポップがループのコードの広く分離された部分で発生する場合は、全体を1つにまとめるのではなく、それぞれに個別のtry/exceptブロックを使用できます。

于 2013-03-01T09:44:03.080 に答える