Python中如何基于字典特定值批量修改键名,优化现有低效实现
优化解决方案
你原来的实现存在3个核心问题:
- 安全性低:
eval会执行字符串内的任意代码,若输入源不可信会有严重注入风险 - 效率低下:多次扫描替换整个长字符串,时间复杂度随字符串长度线性增长
- 准确性差:如果值字段中出现
device.X格式的子串,会被误替换
更优的方案是全程在字典结构上操作,不需要来回转字符串做替换,实现如下:
实现代码
import ast s = '{"some.info": "ABC","more.info": "DEF","device.0.Id":"12345678", "device.0.Type":"DEVICE-X", ' \ '"device.0.Status":"ACTIVE", "device.1.Id":"123EFEF8", "device.1.Type":"DEVICE-Y", "device.1.Status":"NOT FOUND", ' \ '"device.2.Id":"ABCD4328", "device.2.Type":"DEVICE-Z", "device.2.Status":"SLEEPING", "other.info":"Hello", ' \ '"additional.info":"Hi Again",}' # 安全解析字符串为字典 original_dict = ast.literal_eval(s) # 第一步:构建前缀映射表:device.X 对应 Type的值 prefix_map = {} for key, val in original_dict.items(): if key.endswith('.Type'): prefix = key.rsplit('.', 1)[0] prefix_map[prefix] = val # 第二步:生成新字典 new_dict = {} for key, val in original_dict.items(): replaced = False for prefix, replace_val in prefix_map.items(): if key.startswith(f"{prefix}."): new_key = key.replace(prefix, replace_val, 1) new_dict[new_key] = val replaced = True break if not replaced: new_dict[key] = val # 若需要转回字符串可使用json.dumps # import json # result_str = json.dumps(new_dict) print(new_dict)
方案优势
- 安全性:
ast.literal_eval只会解析Python字面量结构,不会执行任意代码,完全规避注入风险 - 高效性:仅需遍历两次字典键,时间复杂度为O(n)(n为字典键的数量),远高于反复操作长字符串的效率
- 准确性:仅修改字典的键字段,不会误改动值内容,也不会出现字符串匹配边界错误的问题
- 易扩展:后续如果要修改替换规则,只需要调整前缀映射和键替换逻辑即可,维护成本低
内容的提问来源于stack exchange,提问作者MikG
相关产品推荐
相关产品推荐

