如何通过点分隔字符串路径为Python嵌套字典的指定项赋值?
点分隔路径操作嵌套字典实现方案
第三方库方案
现有成熟的第三方库可以直接满足需求,不用自己造轮子:
python-box:支持原生点语法访问,也兼容你需要的字符串点路径写法
安装命令:pip install python-box
使用示例:from box import Box data_dictionary = { "user_data": { "first_name": "Some", "last_name": "Guy", "phone": "212-111-1234" } } data = Box(data_dictionary) # 直接按你想要的写法赋值 data['user_data.phone'] = '818-333-4567' # 也支持直接点属性访问:data.user_data.phone = '818-333-4567' # 需要转回普通字典调用 data.to_dict() 即可glom:专门用于嵌套数据结构的读写,适合处理更复杂的嵌套场景
安装命令:pip install glom
使用示例:import glom data_dictionary = { "user_data": { "first_name": "Some", "last_name": "Guy", "phone": "212-111-1234" } } glom.assign(data_dictionary, 'user_data.phone', '818-333-4567') # 读取对应值用 glom.glom(data_dictionary, 'user_data.phone')
原生Python实现方案
如果不想引入额外依赖,可以自定义继承自dict的类,直接实现你要的语法:
class DotAccessDict(dict): def __getitem__(self, key): if '.' not in key: return super().__getitem__(key) current = self for k in key.split('.'): current = current[k] return current def __setitem__(self, key, value): if '.' not in key: return super().__setitem__(key, value) keys = key.split('.') current = self # 定位到最后一级父字典 for k in keys[:-1]: current = current[k] current[keys[-1]] = value
使用示例:
data_dictionary = DotAccessDict({ "user_data": { "first_name": "Some", "last_name": "Guy", "phone": "212-111-1234" } }) # 完全符合你需要的写法 data_dictionary['user_data.phone'] = '818-333-4567' # 读取也支持相同语法 print(data_dictionary['user_data.phone'])
如果需要支持自动创建中间不存在的嵌套层级,只要在逐层遍历的时候增加判断:如果当前层级没有对应key,自动创建空字典即可。
内容的提问来源于stack exchange,提问作者Gatmando
相关产品推荐
相关产品推荐

