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

Python3实现字典键存在时自动递增键名的高效方案

高效实现字典键递增避免覆盖的方案

你的核心问题是每次寻找可用递增键时都要逐个遍历检查,数据量较大时效率极低。优化思路是提前统计每个基础键的当前最大后缀序号,后续直接基于这个序号生成新键,无需重复遍历。

实现步骤

  1. 预处理原字典,构建计数器字典,记录每个基础键对应的最大后缀数字:
    • 无后缀的键(如key)视为序号0
    • 带_数字后缀的键,提取数字后保留最大值
  2. 遍历待添加的字典列表时,直接用计数器的当前最大值+1生成新键,添加后更新计数器

优化后代码

from pprint import pprint

my_dict = {
    'key': 'A',
    'key_1': 'B',
    'key_2': 'C',
    'key_3': 'D',
    'key_4': 'E',
    'key_5': 'F',
}

my_dict_list = [
    {'key': 'G'},
    {'key': 'H'},
    {'key': 'I'},
    {'key': 'J'},
    {'key': 'K'},
]

# 预处理:统计每个基础键的最大后缀序号
key_counter = {}
for k in my_dict.keys():
    if '_' in k:
        base_key, num_str = k.rsplit('_', 1)
        if num_str.isdigit():
            num = int(num_str)
            if base_key in key_counter:
                if num > key_counter[base_key]:
                    key_counter[base_key] = num
            else:
                key_counter[base_key] = num
    else:
        # 无后缀的键,序号记为0
        key_counter[k] = key_counter.get(k, 0)

# 处理待添加的字典列表
for item in my_dict_list:
    for k, v in item.items():
        if k not in my_dict:
            my_dict[k] = v
            key_counter[k] = 0
        else:
            # 直接取当前最大序号+1生成新键
            next_num = key_counter[k] + 1
            new_k = f"{k}_{next_num}"
            my_dict[new_k] = v
            key_counter[k] = next_num

pprint(my_dict)

输出结果

{'key': 'A',
 'key_1': 'B',
 'key_10': 'K',
 'key_2': 'C',
 'key_3': 'D',
 'key_4': 'E',
 'key_5': 'F',
 'key_6': 'G',
 'key_7': 'H',
 'key_8': 'I',
 'key_9': 'J'}

效率说明

  • 预处理阶段仅遍历原字典一次,时间复杂度O(n)(n为原字典键的数量)
  • 处理每个待添加元素时,仅需O(1)的操作即可生成新键,无需循环检查
  • 相比原实现的嵌套循环(最坏情况O(m*100),m为待添加元素数量),大数据集下效率提升非常显著

内容的提问来源于stack exchange,提问作者MBasith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 17:01:17