[解決済み] collections.ChainMapの目的は何ですか?
質問
Python 3.3では
ChainMap
クラスが追加され
collections
モジュールに追加されました。
ChainMapクラスは、いくつかのマッピングを素早くリンクし、一つのユニットとして扱えるようにするために提供されます。 を素早くリンクするために提供されています。これは多くの場合 新しい辞書を作成し、複数のupdate()コールを実行するよりもはるかに高速です。
例を挙げます。
>>> from collections import ChainMap
>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 10, 'c': 11}
>>> z = ChainMap(y, x)
>>> for k, v in z.items():
print(k, v)
a 1
c 11
b 10
動機となったのは
この問題
によって公開され
これ
(ノ
PEP
は作成されませんでした)。
私が理解する限り、これは余分な辞書を持ち、それを
update()
s.
という質問があります。
-
どのようなユースケースで
ChainMap
はどのようなケースをカバーしていますか? -
の実例はありますか?
ChainMap
? - Python3に移行したサードパーティライブラリで使用されているのでしょうか?
ボーナス質問:Python2.x上でそれを使用する方法はありますか?
で聞いたことがあります。
Transforming Code into Beautiful, Idiomatic Python
Raymond HettingerによるPyConのトークで聞いたことがあり、自分のツールキットに加えたいと思っていますが、いつ使うべきかの理解に欠けています。
どのように解決するのですか?
私は @b4hand の例が好きで、実際、私は過去に ChainMap のような構造体 (ChainMap 自体ではない) を、彼が言及した 2 つの目的、すなわち多層の設定オーバーライド、および変数スタック/スコープ エミュレーションに使用したことがあります。
の他の 2 つの動機/利点/相違を指摘したいと思います。
ChainMap
と、dict-update ループを使用し、したがって "最終バージョン" を保存するだけであることと比較して。
-
詳細はこちら。 ChainMap構造はquot;layered"なので、以下のような質問に答えることをサポートします。私はデフォルト値、またはオーバーライドされた値を取得していますか?元の ("default") 値は何ですか? その値はどのレベルでオーバーライドされたのか(@b4hand の設定の例:user-config または command-line-overrides を借用)?単純なdictを使用すると、これらの質問に答えるために必要な情報はすでに失われています。
-
速度のトレードオフ。 もし、あなたが
N
レイヤーがあり、最大でM
のキーを持つ、ChainMap を構築するにはO(N)
で、それぞれのルックアップはO(N)
を要するのに対し、更新ループを用いたdictの構築は、最悪[*]にO(NM)
を要し、各ルックアップはO(1)
. つまり、頻繁に構築し、毎回数回のルックアップしか行わない場合、あるいはM
が大きい場合、ChainMapの遅延構築のアプローチは有利に働きます。
[*] (2)の解析では、dict-accessを想定しています。
O(1)
であると仮定していますが、実際には
O(1)
であり
O(M)
が最悪の場合です。詳細を見る
こちら
.
関連
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] __init__.py は何のためにあるのですか?
-
[解決済み] 辞書のリストを辞書の値でソートするにはどうしたらいいですか?
-
[解決済み] 自分」という言葉は何のためにあるのか?
-
[解決済み】if __name__ == "__main__": は何をするのでしょうか?
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み] PILからopenCVフォーマットへの変換
-
[解決済み] tensorflowのCPUのみのインストールでダイナミックライブラリ 'cudart64_101.dll' を読み込めなかった
最新
-
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の「名前付きタプル」とは何ですか?
-
[解決済み] collections.defaultdictはどのように機能するのですか?
-
[解決済み] Pythonによる辞書の "拡張"
-
[解決済み] ディクテのリストを1つのディクテにマージするには?
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] 文字列のリストを内容に基づいてフィルタリングする
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] Python Empty Generator 関数