Python列表重构:将非重复元素按递增1规则调整
问题修正:Python列表元素重映射需求
需求说明
输入列表:
values = [1827, 1827, 1829, 1829, 1827, 1827, 1833]
规则要求:
- 重复出现的元素保持映射后的值不变
- 首次出现的新元素,映射值设为当前列表已出现的最大值加1
- 后续再次出现该新元素,沿用之前的映射值
示例:1829首次出现时,当前已出现的最大值是1827,所以映射为1828;1833首次出现时,当前已出现的最大值是1828,所以映射为1829。预期输出:
[1827,1827,1828,1828,1827,1827,1829]
原代码及问题
原代码仅将元素直接映射为自身,未处理新元素的重映射规则,导致输出不符合预期:
contact_ids = [1827, 1827, 1829, 1829, 1827, 1827, 1833] output = [] seen_ids = {} for id in contact_ids: if id not in seen_ids: seen_ids[id] = id output.append(id) else: output.append(seen_ids[id]) print("CONTACT_ID") for id in output: print(id)
当前输出:
CONTACT_ID 1827 1827 1829 1829 1827 1827 1833
修正方案
需要维护两个核心变量:原ID到新ID的映射字典,以及当前已使用的最大值。遍历元素时按规则更新映射和最大值,代码如下:
contact_ids = [1827, 1827, 1829, 1829, 1827, 1827, 1833] output = [] id_mapping = {} current_max = None for id in contact_ids: if id not in id_mapping: # 处理首次出现的元素 if current_max is None: # 第一个元素直接作为初始最大值 new_id = id current_max = id else: # 新元素映射为当前最大值+1,并更新最大值 new_id = current_max + 1 current_max = new_id id_mapping[id] = new_id # 不管是否首次出现,都添加映射后的值到输出 output.append(id_mapping[id]) print("CONTACT_ID") for id in output: print(id)
逻辑说明
- 初始化
id_mapping存储原ID到新ID的对应关系,current_max记录当前已使用的最大值 - 遍历每个元素:
- 若元素未在映射中,根据
current_max计算新ID:第一个元素直接用自身,后续新元素用current_max+1,同时更新current_max和映射字典 - 若元素已在映射中,直接取映射值加入输出
- 若元素未在映射中,根据
- 最终输出符合需求的结果
运行后输出:
CONTACT_ID 1827 1827 1828 1828 1827 1827 1829
内容的提问来源于stack exchange,提问作者louis grivel
相关产品推荐
相关产品推荐

