如何使用format()格式化含嵌套结构的Python字典
解决字典嵌套结构的字符串格式化问题
你有如下嵌套结构的字典:
info={ "name": "Naser", "key1": "Good morning {name}", "key2": "Good evening {name}", "key3": "Good night {name}", "list1":["word1","word2",{"user": "{name}"}], }
尝试用以下代码循环格式化所有内容时:
for item in info: info[item].format(**info)
出现错误:AttributeError: 'list' object has no attribute 'format'
原代码仅能处理顶层字典的直接字符串值,遇到列表、嵌套字典这类复合结构就会报错。要实现全分支格式化,需要递归遍历所有层级的元素,根据元素类型做针对性处理:
解决方案:递归处理嵌套结构
方式1:生成格式化后的新结构
适合不想修改原字典的场景,递归遍历并返回新的格式化后数据:
def format_nested_structure(data, context): if isinstance(data, str): return data.format(**context) elif isinstance(data, list): return [format_nested_structure(item, context) for item in data] elif isinstance(data, dict): return {key: format_nested_structure(value, context) for key, value in data.items()} # 非字符串、列表、字典的类型直接返回原数据 else: return data # 生成格式化后的新字典 formatted_info = format_nested_structure(info, info) print(formatted_info)
运行结果:
{ "name": "Naser", "key1": "Good morning Naser", "key2": "Good evening Naser", "key3": "Good night Naser", "list1": ["word1", "word2", {"user": "Naser"}] }
方式2:原地修改原结构
如果需要直接修改原字典,可调整函数为原地更新:
def format_nested_structure_inplace(data, context): if isinstance(data, str): return data.format(**context) elif isinstance(data, list): for i in range(len(data)): data[i] = format_nested_structure_inplace(data[i], context) elif isinstance(data, dict): for key in data: data[key] = format_nested_structure_inplace(data[key], context) return data # 直接修改原字典 format_nested_structure_inplace(info, info) print(info)
以上两种方式都能遍历处理所有层级的嵌套元素,完成所有{name}占位符的替换。
内容的提问来源于stack exchange,提问作者NaserOwaimer
相关产品推荐
相关产品推荐

