web-dev-qa-db-ja.com

データに既存のキーがある場合のネストされた辞書の更新

キーが既に存在する場合、以前のエントリを上書きせずに、ネストされた辞書の値を更新しようとしています。たとえば、私は辞書を持っています:

  myDict = {}
  myDict["myKey"] = { "nestedDictKey1" : aValue }

与える、

 print myDict
>> { "myKey" : { "nestedDictKey1" : aValue }}

ここで、"myKey"の下に別のエントリを追加します

myDict["myKey"] = { "nestedDictKey2" : anotherValue }}

これは戻ります:

print myDict
>> { "myKey" : { "nestedDictKey2" : anotherValue }}

でも私はしたい:

print myDict
>> { "myKey" : { "nestedDictKey1" : aValue , 
                 "nestedDictKey2" : anotherValue }}

以前の値を上書きせずに、"myKey"を新しい値で更新または追加する方法はありますか?

13
eric

これはとてもいいことです ネストされたdictを処理するための一般的な解決策

import collections
def makehash():
    return collections.defaultdict(makehash)

これにより、ネストされたキーを任意のレベルで設定できます。

myDict = makehash()
myDict["myKey"]["nestedDictKey1"] = aValue
myDict["myKey"]["nestedDictKey2"] = anotherValue
myDict["myKey"]["nestedDictKey3"]["furtherNestedDictKey"] = aThirdValue

単一レベルのネストの場合、defaultdictを直接使用できます。

from collections import defaultdict
myDict = defaultdict(dict)
myDict["myKey"]["nestedDictKey1"] = aValue
myDict["myKey"]["nestedDictKey2"] = anotherValue

そして、これがdictのみを使用する方法です:

try:
  myDict["myKey"]["nestedDictKey2"] = anotherValue
except KeyError:
  myDict["myKey"] = {"nestedDictKey2": anotherValue}
13
Allen Luce

これにはcollections.defaultdictを使用でき、ネストされた辞書内でキーと値のペアを設定するだけです。

from collections import defaultdict
my_dict = defaultdict(dict)
my_dict['myKey']['nestedDictKey1'] = a_value
my_dict['myKey']['nestedDictKey2'] = another_value

または、最後の2行を次のように書くこともできます

my_dict['myKey'].update({"nestedDictKey1" : a_value })
my_dict['myKey'].update({"nestedDictKey2" : another_value })
8
Stuart
myDict["myKey"]["nestedDictKey2"] = anotherValue

myDict["myKey"]入れ子になった辞書を返します。他の辞書と同じように、別のキーを追加できます:)

例:

>>> d = {'myKey' : {'k1' : 'v1'}}
>>> d['myKey']['k2'] = 'v2'
>>> d
{'myKey': {'k2': 'v2', 'k1': 'v1'}}
0
slider

ネストされたdictを不変として扱うことができます:

myDict["myKey"] = dict(myDict["myKey"], **{ "nestedDictKey2" : anotherValue })

0