Python实现混合字符ID替换为纯数字唯一ID的优化咨询
问题分析
你的代码核心问题是没维护原始ID到新数字ID的映射关系——要么全局只生成了一个随机数复用,要么每次处理ID都重新生成随机数但不缓存结果,最终导致所有ID被替换成同一个值。
优化方案
核心思路是先建立一个映射字典,记录每个原始ID对应的唯一数字ID:遍历数据时先查字典,存在就用已有的数字ID,不存在则生成新的并存入字典,确保相同原始ID对应同一个新ID。
示例代码(Python处理JSON数据)
假设你的人员数据是JSON数组格式,以下是可直接复用的优化代码:
import json import random def replace_ids(person_data): id_mapping = {} # 第一步:遍历所有数据,建立原始ID到新数字ID的映射 for person in person_data: original_id = person["id"] if original_id not in id_mapping: # 生成6位随机数字ID(可按需调整范围) new_id = random.randint(100000, 999999) # 可选:确保新ID绝对不重复(随机范围足够大时可省略) while new_id in id_mapping.values(): new_id = random.randint(100000, 999999) id_mapping[original_id] = new_id # 第二步:统一替换所有ID for person in person_data: person["id"] = id_mapping[person["id"]] return person_data # 测试用例 raw_json = ''' [ {"id": "X789", "name": "王五"}, {"id": "Y123", "name": "赵六"}, {"id": "X789", "name": "王五(重复ID)"} ] ''' data = json.loads(raw_json) processed_data = replace_ids(data) print(json.dumps(processed_data, ensure_ascii=False, indent=2))
关键细节
- 映射字典的必要性:缓存已处理的ID,避免重复生成,保证相同原始ID对应同一个新ID。
- 更稳妥的ID生成方式:如果不需要随机,用自增数字更高效且绝对唯一,替换映射生成逻辑即可:
id_mapping = {} current_id = 1 for person in person_data: original_id = person["id"] if original_id not in id_mapping: id_mapping[original_id] = current_id current_id += 1 - 处理顺序:先遍历所有数据建立完整映射,再统一替换,避免中途出现重复ID。
你原代码的典型错误
如果你的原代码是类似下面这样,就会导致所有ID相同:
# 错误代码示例 def bad_replace_ids(person_data): new_id = random.randint(100000, 999999) # 只生成一次随机数 for person in person_data: person["id"] = new_id return person_data
内容的提问来源于stack exchange,提问作者LuiTe
相关产品推荐
相关产品推荐

