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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 15:33:18