You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:45:01