1. ホーム
  2. パイソン

[解決済み] poppingせずにdequeの前をpeekする方法は?

2022-03-03 01:28:28

質問

ある条件をキューの先頭でチェックして、ポップするかどうかを決めたいのです。pythonでcollections.dequeを使用してこれを実現するにはどうすればよいですか?

list(my_deque)[0]

は醜く、パフォーマンスも悪いと思われます。

解決方法は?

TL;DR。 を想定しています。 deque というのは d を検査するだけです。 d[-1] というのも、dequeの一番右の要素が先頭になるからです(dequeの長さの前にテストして、空でないことを確認するとよいでしょう)。asongtoruinの提案にしたがって、次のようにします。 if d: を使用して、dequeが空かどうかをテストします。 if len(d) == 0: しかし、よりpythonicです)

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

なぜなら deque はインデックス可能です。 をテストしているわけですが、その前に . 一方 deque はリストに似たインターフェイスを持ちますが、その実装は前後の操作に最適化されています。引用元 ドキュメント :

Dequesは、スレッドセーフでメモリ効率の良い追加とポップをサポートします。 dequeのどちら側でもほぼ同じO(1)の性能で のどちらかです。

リストオブジェクトも同様の操作をサポートしていますが、リストオブジェクトは 高速な固定長操作と、O(n)のメモリ移動コストが発生します。 pop(0)とinsert(0, v)操作で、サイズも変化します。 の位置は、データ表現の基礎となるものです。

キューの真ん中にアクセスする操作が多い場合は、リストへの変換が望ましいかもしれません。再びドキュメントを引用します。

インデックス付きアクセスは両端ではO(1)ですが、中間ではO(n)に遅くなります。 高速なランダムアクセスのためには、代わりにリストを使う。

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