[解決済み] poppingせずにdequeの前をpeekする方法は?
質問
ある条件をキューの先頭でチェックして、ポップするかどうかを決めたいのです。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)です。
関連
-
Pythonによるjieba分割ライブラリ
-
[解決済み】Python: OverflowError: 数学の範囲エラー
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] PandasでDataFrameの行を反復処理する方法
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] 文字列が数値(float)であるかどうかを確認するにはどうすればよいですか?
-
[解決済み] 最近のPythonでカスタム例外を宣言する適切な方法?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonの非常に便利な2つのデコレーターを解説
-
Python機械学習Githubが8.9Kstarsに達したモデルインタープリタLIME
-
パッケージングツールPyinstallerの使用と落とし穴の回避
-
Python入門 openを使ったファイルの読み書きの方法
-
[解決済み】TypeError: unhashable type: 'numpy.ndarray'.
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み】インポートエラー。モジュール名 urllib2 がない
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。
-
[解決済み】 TypeError: += でサポートされていないオペランド型: 'int' および 'list' です。