ポップするかどうかを決定する前に、キューの先頭に対して条件をチェックしたい。 collections.dequeでpythonでこれを達成するにはどうすればよいですか?
list(my_deque)[0]
くてパフォーマンスが悪いようです。
TL; DR:deque
がd
と呼ばれると仮定すると、単に_d[-1]
_を検査します。両端キュー内の右端の要素はフロントです(両端キューの長さの前にテストして、空でないことを確認することができます)。 @asongtoruinの提案に従い、_if d:
_を使用して両端キューが空かどうかをテストします(if len(d) == 0:
と同等ですが、よりPythonicです)
deque
sはインデックス可能であり、フロントをテストしているためです。 deque
にはリストに似たインターフェースがありますが、実装はフロントおよびバック操作用に最適化されています。 ドキュメント の引用:
Dequeは、スレッドセーフでメモリ効率の良い追加とポップを両端からサポートします。どちらの方向でも、ほぼ同じO(1)のパフォーマンスです。
リストオブジェクトは同様の操作をサポートしていますが、高速固定長操作と、両方を変更するpop(0)およびinsert(0、v)操作のメモリ移動コストO(n))に最適化されています基になるデータ表現のサイズと位置。
キューの「中間」にアクセスする操作が多数ある場合は、リストへの変換が望ましい場合があります。再びドキュメントを引用します:
インデックス付きアクセスは、両端でO(1)ですが、途中でO(n)になります。高速ランダムアクセスの場合は、代わりにリストを使用します。
list
への変換はO(n)ですが、その後のアクセスはすべてO(1)です。
これは、ポップする前にキューの先頭を確認できるようにする簡単な実装です(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
_
_my_deque[-1]
_またはmy_deque[len(my_deque)-1]
を使用して、最後の要素を簡単に見つけることができます。