如何使用任意长度的键更新python字典?

时间:2015-07-25 09:58:36

标签: python dictionary

我正在使用python 2.4更新一个非常复杂且可能未知的字典,并且密钥很复杂但很明确。例如,字典是:

dict1 = {
  'server' : {
    'index' : 0,
    'info' : {
      'ip' : '127.0.0.1',
      'user' : {
        'number' : 1001,
        'tel' : '123456'
      }
    }
  }
}

现在我想通过使用密钥'server' - 'info' - 'user' - 'number'来更新(删除或修改)它。

我想通过使用显式键列表来更新字典,而我只知道除了内部数据之外的字典对象,我该怎么办?

2 个答案:

答案 0 :(得分:3)

考虑

>>> def get_nested(d, keys):
...     return reduce(dict.get, [d] + keys)
... 
>>> def set_nested(d, keys, value):
...     get_nested(d, keys[:-1])[keys[-1]] = value
... 
>>> dict1 = {
...   'server' : {
...     'index' : 0,
...     'info' : {
...       'ip' : '127.0.0.1',
...       'user' : {
...         'number' : 1001,
...         'tel' : '123456'
...       }
...     }
...   }
... }
>>> 
>>> keys = 'server-info-user-number'.split('-')
>>> get_nested(dict1, keys)
1001
>>> set_nested(dict1, keys, 2555)
>>> dict1
{'server': {'info': {'ip': '127.0.0.1', 'user': {'tel': '123456', 'number': 2555}}, 'index': 0}}

答案 1 :(得分:1)

您可以尝试解析密钥'server-info-user-number'

def get_from_dict(d, key):
    keys = key.split('-')
    for key in keys:
        d = d[key]
    return d 

def set_from_dict(d, key, val):
    keys = key.split('-')
    for key in keys[:-1]:
        d = d[key]
    d[keys[-1]] = val

dict1 = {
  'server' : {
    'index' : 0,
    'info' : {
      'ip' : '127.0.0.1',
      'user' : {
        'number' : 1001,
        'tel' : '123456'
      }
    }
  }
}

key = 'server-info-user-number'
print(get_from_dict(dict1, key))
set_from_dict(dict1, key, 1002)
print(get_from_dict(dict1, key))

(为第一次获取返回1001,然后设置为1002并获取该值。)