如何为存在重复元素的列表赋值新序号,相同旧值对应同一个连续新值
实现相同旧值映射唯一递增新序号的方法
核心逻辑是用字典存储已经处理过的旧值对应的新序号,避免重复分配序号,仅在首次遇到新的旧值时自增起始序号:
- 初始化空字典存储旧值到新序号的映射关系
- 遍历旧列表的每一个元素:
- 若元素已存在于字典中,直接取出对应新序号加入结果列表
- 若元素不存在于字典中,将当前起始值作为它的新序号存入字典,加入结果列表后将起始值自增1
可直接运行的实现代码
startval = 901 old_index = [100, 145, 145, 740, 740, 740, 276, 277, 278] new_index = [] old_to_new = {} for val in old_index: if val not in old_to_new: old_to_new[val] = startval startval += 1 new_index.append(old_to_new[val]) print(new_index) # 输出:[901, 902, 902, 903, 903, 903, 904, 905, 906]
原代码的问题说明
原有实现的核心问题是没有记录已经处理过的重复旧值,同时频繁调用list.count()方法会导致时间复杂度升至O(n²),列表长度较大时运行效率极低。上面的字典映射方案时间复杂度为O(n),适合任意长度的列表处理。
内容的提问来源于stack exchange,提问作者user3027413
相关产品推荐
相关产品推荐

