簡體   English   中英

根據鍵名搜索和更新嵌套字典

[英]Search and update nested dictionary based on key name

我有一個可變深度的嵌套字典,如果鍵已經存在於字典中,並且如果鍵不存在,我想用字符串更新鍵,如果鍵不存在,則將鍵添加到字典的根。 例如,假設原始字典是:

 d= { 
 'key_1_level_1': 'item_1_level_1', 
 'key_2_level_1': {
    'key_1_level_2': 'item_1_level_2', 
    'key_2_level_2': 'item_2_level_2' }
 }

現在,我想用字符串new_item更新key_1_level_2以便字典看起來像這樣:

 d= { 
 'key_1_level_1': 'item_1_level_1', 
 'key_2_level_1': {
    'key_1_level_2': 'item_1_level_2', 
    'key_2_level_2': 'item_2_level_2'} 
 }

我不能使用d.update({'key_1_level_2': 'new_item'})因為它不能在除根之外的較低級別工作。 所以這樣做最終會變成:

     d= { 
     'key_1_level_1': 'item_1_level_1', 
     'key_2_level_1': {
        'key_1_level_2': 'new_item', 
        'key_2_level_2': 'item_2_level_2'},
      {'key_1_level_2': 'new_item'} 
     }

但是,請注意,如果輸入鍵是帶有字符串值的key_2_level_1 必須用輸入字符串值覆蓋該級別的字典。

另一方面,如果輸入不存在,即key_3_level_1 = new_item ,則應將其添加到根中,例如:

 d= { 
 'key_1_level_1': 'item_1_level_1', 
 'key_2_level_1': {
    'key_1_level_2': 'item_1_level_2', 
    'key_2_level_2': 'item_2_level_2'}
 'key_3_level_1': 'new_item', 
 }

到目前為止,我嘗試了這個功能。 它只會接收字符串值 這適用於已經存在的密鑰,但無法創建新密鑰:

d= { 'key_1_level_1': 'item_1_level_1', 
     'key_2_level_1': {
        'key_1_level_2': 'item_1_level_2', 
        'key_2_level_2': 'item_2_level_2'} 
     }

input_key = "new_key"
value = "new_item"

def _update_dictionary(dictionary, input_key, value):
  if input_key in dictionary:
    dictionary.update({input_key: value})
  else:
    for k, v in dictionary.items():
      if isinstance(v, dict):
        _update_dictionary(v, input_key, value)
  return  dictionary
  
dictionary = _update_dictionary(d, input_key, value)
print(dictionary)
{'key_2_level_1': {'key_2_level_2': 'item_2_level_2', 'key_1_level_2': 'item_1_level_2'}, 
'key_1_level_1': 'item_1_level_1'}

理想情況下,此輸出應該是:

{'key_2_level_1': {'key_2_level_2': 'item_2_level_2', 'key_1_level_2': 'item_1_level_2'}, 
'key_1_level_1': 'item_1_level_1',
'new_key': 'new_item'}

什么是最好的方法來做到這一點?

如果我們從未找到它,您需要確保我們最終將鍵添加到最外層字典:

def _update_dictionary(dictionary, key, value, root=True):
    success = False
    if key in dictionary:
        dictionary[key] = value
        return True
    for k, v in dictionary.items():
        if isinstance(v, dict):
            success = _update_dictionary(v, key, value, root=False)
            if success:
                return True
    if root and not success:
        dictionary[key] = value
        return True
    return False

>>> _update_dictionary(d, input_key, value)
>>> print(d)
{'key_1_level_1': 'item_1_level_1',
 'key_2_level_1': {'key_1_level_2': 'item_1_level_2',
  'key_2_level_2': 'item_2_level_2'},
 'new_key': 'new_item'}

您還會注意到我更改了函數的接口:由於它就地修改了字典,因此不應返回它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM