web-dev-qa-db-ja.com

ポップせずにdequeの前面を覗く方法は?

ポップするかどうかを決定する前に、キューの先頭に対して条件をチェックしたい。 collections.dequeでpythonでこれを達成するにはどうすればよいですか?

list(my_deque)[0]

くてパフォーマンスが悪いようです。

11
JSStuball

TL; DR:dequedと呼ばれると仮定すると、単に_d[-1]_を検査します。両端キュー内の右端の要素はフロントです(両端キューの長さの前にテストして、空でないことを確認することができます)。 @ason​​gtoruinの提案に従い、_if d:_を使用して両端キューが空かどうかをテストします(if len(d) == 0:と同等ですが、よりPythonicです)

リストに変換しないのはなぜですか?

dequesはインデックス可能であり、フロントをテストしているためです。 dequeにはリストに似たインターフェースがありますが、実装はフロントおよびバック操作用に最適化されています。 ドキュメント の引用:

Dequeは、スレッドセーフでメモリ効率の良い追加とポップを両端からサポートします。どちらの方向でも、ほぼ同じO(1)のパフォーマンスです。

リストオブジェクトは同様の操作をサポートしていますが、高速固定長操作と、両方を変更するpop(0)およびinsert(0、v)操作のメモリ移動コストO(n))に最適化されています基になるデータ表現のサイズと位置。

キューの「中間」にアクセスする操作が多数ある場合は、リストへの変換が望ましい場合があります。再びドキュメントを引用します:

インデックス付きアクセスは、両端でO(1)ですが、途中でO(n)になります。高速ランダムアクセスの場合は、代わりにリストを使用します。

listへの変換はO(n)ですが、その後のアクセスはすべてO(1)です。

12
GPhilo

これは、ポップする前にキューの先頭を確認できるようにする簡単な実装です(whileと_q[0]_を使用):

以下の_q[0]_に対して独自の条件を適用します。q.popleft()の前、以下:

_testLst = [100,200,-100,400,340]
q=deque(testLst)

while q:
    print(q)
    print('{}{}'.format("length of queue: ", len(q)))
    print('{}{}'.format("head: ", q[0]))
    print()

    q.popleft()
_

出力

_deque([100, 200, -100, 400, 340])
length of queue: 5
head: 100

deque([200, -100, 400, 340])
length of queue: 4
head: 200

deque([-100, 400, 340])
length of queue: 3
head: -100

deque([400, 340])
length of queue: 2
head: 400

deque([340])
length of queue: 1
head: 340
_
0
Grant Shannon

_my_deque[-1]_またはmy_deque[len(my_deque)-1]を使用して、最後の要素を簡単に見つけることができます。

0
suraz negi