Python3实现字典键存在时自动递增键名的高效方案
高效实现字典键递增避免覆盖的方案
你的核心问题是每次寻找可用递增键时都要逐个遍历检查,数据量较大时效率极低。优化思路是提前统计每个基础键的当前最大后缀序号,后续直接基于这个序号生成新键,无需重复遍历。
实现步骤
- 预处理原字典,构建计数器字典,记录每个基础键对应的最大后缀数字:
- 无后缀的键(如
key)视为序号0 - 带
_数字后缀的键,提取数字后保留最大值
- 无后缀的键(如
- 遍历待添加的字典列表时,直接用计数器的当前最大值+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
相关产品推荐
相关产品推荐

