web-dev-qa-db-ja.com

Pythonは辞書を "拡張"する

別の辞書で辞書を拡張するための最良の方法はどれですか?例えば:

>>> a = { "a" : 1, "b" : 2 }
>>> b = { "c" : 3, "d" : 4 }
>>> a
{'a': 1, 'b': 2}
>>> b
{'c': 3, 'd': 4}

forループを回避してこれを取得するための操作を探しています。

{ "a" : 1, "b" : 2, "c" : 3, "d" : 4 }

私は何かをしたいのですが。

a.extend(b)  # This does not work
387
FerranB
598
Nick Fortescue

この閉じた質問の美しい宝石

どちらの入力ディジットも変えない「oneliner way」は、

basket = dict(basket_one, **basket_two)

**basket_two**)がここで何を意味するのかを学びましょう

矛盾がある場合は、basket_twoの項目がbasket_oneの項目をオーバーライドします。一行に行くと、これはかなり読みやすく、透明であり、他の2つが混在している辞書が便利になるときはいつでもそれを使用することに反対するようなことはありません。これがdict**フォームについて学ぶことを促す方法です;-)。したがって、たとえば、次のように使用します。

x = mungesomedict(dict(adict, **anotherdict))

私のコードではかなり頻繁に発生します。

当初の投稿者= Alex Martelli

注:Python 3では、これはbasket_two内のすべてのキーがstringである場合にのみ機能します。

166
Tom Leys

辞書マッピングで辞書内包表記を使用してみましたか。

c = {**a, **b}
# c = { "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
27
Vlad Bezden
a.update(b)

bからaまでのキーと値を追加します。すでにキーの値がある場合は上書きします。

23
vartec

他の人が言ったように、いくつかのabのためのa.update(b)はあなたがあなたの質問であなたが求めた結果を達成するでしょう。しかし、extendメソッドでオブジェクトをマッピング/設定する方法で、a.extend(b)aの値をbの値で上書きしてはいけないことを望んでいることを何度も指摘したいと思います。 a.update(b)aの値を上書きするので、extendには適していません。

このメソッドをdefaultsまたはinjectと呼ぶ言語があることに注意してください。これは、存在する可能性のある値を上書きせずにbの値(デフォルト値のセットになる可能性がある)を辞書に注入する方法と考えることができます。

もちろん、a.extend(b)b.update(a); a=bとほぼ同じです。割り当てを削除するには、次のようにします。

def extend(a,b):
    """Create a new dictionary with a's properties extended by b,
    without overwriting.

    >>> extend({'a':1,'b':2},{'b':3,'c':4})
    {'a': 1, 'c': 4, 'b': 2}
    """
    return dict(b,**a)

dictに副作用のないextendコンストラクタを使用したスマートなアイデアを提供してくれたTom Leysに感謝します。

17
eblume

Python 3.3で導入されたpythonの collections.Chainmap を使うこともできます。

from collections import Chainmap
c = Chainmap(a, b)
c['a'] # returns 1

ユースケースに応じて、これにはいくつかの利点があります。それらはより詳細に説明されています ここ 、しかし私は簡単な概要を述べるつもりです:

  • チェーンマップは辞書のビューのみを使用するため、実際にはデータはコピーされません。これにより、連鎖が速くなります(ただし、ルックアップは遅くなります)。
  • キーは実際には上書きされないので、必要に応じて、データがaから来たのかbから来たのかがわかります。

これは主に設定辞書のようなものに役立ちます。

0
Ivo Merchiers