Updating nested dictionaries when data has existing key

前端 未结 5 707
感动是毒
感动是毒 2020-12-08 22:22

I am trying to update values in a nested dictionary, without over-writting previous entries when the key already exists. For example, I have a dictionary:

           


        
相关标签:
5条回答
  • 2020-12-08 23:01
    myDict["myKey"]["nestedDictKey2"] = anotherValue
    

    myDict["myKey"] returns the nested dictionary to which we can add another key like we do for any dictionary :)

    Example:

    >>> d = {'myKey' : {'k1' : 'v1'}}
    >>> d['myKey']['k2'] = 'v2'
    >>> d
    {'myKey': {'k2': 'v2', 'k1': 'v1'}}
    
    0 讨论(0)
  • 2020-12-08 23:08

    You can write a generator to update key in nested dictionary, like this.

    def update_key(key, value, dictionary):
            for k, v in dictionary.items():
                if k == key:
                    dictionary[key]=value
                elif isinstance(v, dict):
                    for result in update_key(key, value, v):
                        yield result
                elif isinstance(v, list):
                    for d in v:
                        if isinstance(d, dict):
                            for result in update_key(key, value, d):
                                yield result
    
    list(update_key('Any level key', 'Any value', DICTIONARY))
    
    0 讨论(0)
  • 2020-12-08 23:19

    You could treat the nested dict as immutable:

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

    0 讨论(0)
  • 2020-12-08 23:26

    This is a very nice general solution to dealing with nested dicts:

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

    That allows nested keys to be set at any level:

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

    For a single level of nesting, defaultdict can be used directly:

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

    And here's a way using only dict:

    try:
      myDict["myKey"]["nestedDictKey2"] = anotherValue
    except KeyError:
      myDict["myKey"] = {"nestedDictKey2": anotherValue}
    
    0 讨论(0)
  • 2020-12-08 23:28

    You can use collections.defaultdict for this, and just set the key-value pairs within the nested dictionary.

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

    Alternatively, you can also write those last 2 lines as

    my_dict['myKey'].update({"nestedDictKey1" : a_value })
    my_dict['myKey'].update({"nestedDictKey2" : another_value })
    
    0 讨论(0)
提交回复
热议问题