Python字典:重复元组第二值复用首次出现的递增编号实现
问题场景
处理键对应二元元组的字典:元组第一位为占位字符串"num",第二位为业务值。需要将占位符替换为从1开始的递增数字,重复出现的业务值直接复用首次分配的编号,不新增计数。
初始字典结构:
my_dict = { "b":("num","bread"), "a":("num","arm"), "d":("num","desk"), "aa":("num","arm"), "c":("num","check"), "aaa":("num","arm"), "dd":("num","desk"), "f":("num","film") }
目标输出结构:
my_dict = { "b":(1,"bread"), "a":(2,"arm"), "d":(3,"desk"), "aa":(2,"arm"), "c":(4,"check"), "aaa":(2,"arm"), "dd":(3,"desk"), "f":(5,"film") }
原有代码问题
- 用列表
saved仅存储了出现过的业务值,没有记录业务值和分配编号的映射关系,遇到重复值时无法快速取出首次分配的编号 - 缺少重复业务值的分支处理逻辑,遍历到重复项时不会给结果字典赋值
实现方案
核心是用字典替代列表做映射存储,建立「业务值 -> 分配编号」的对应关系,O(1)时间即可完成重复判断和编号查询:
- 计数器初始值设为1,匹配从1开始的编号规则
- 遍历字典每一项,拆分出元组里的业务值
- 业务值不在映射字典中时,给该值分配当前计数器的编号存入映射,计数器自增
- 无论业务值是否首次出现,都从映射中取出对应编号,和业务值组成新元组赋值给对应键
完整可运行代码:
count = 1 value_id_map = {} result = {} for key, (_, final_val) in my_dict.items(): if final_val not in value_id_map: value_id_map[final_val] = count count += 1 result[key] = (value_id_map[final_val], final_val) my_dict = result
注意事项
Python 3.7及以上版本的原生字典默认保留插入顺序,编号分配顺序会和给出的示例完全一致;如果使用低于3.7的Python版本,需要用
collections.OrderedDict存储原字典保证遍历顺序固定,否则编号顺序会出现偏差。
运行后打印my_dict即可得到预期结果。
内容的提问来源于stack exchange,提问作者itt
相关产品推荐
相关产品推荐

