如何为重复列表元素按首次出现顺序分配对应序数标签?
字符串列表的顺序标签赋值高效实现
核心实现思路
针对这类字符串列表的标签赋值需求,最优的实现方式是单次遍历+字典缓存映射,全程不需要重复遍历比对元素,能最大程度保证处理效率:
- 用字典记录每一个首次出现的字符串对应的标签值,字典的键查找、插入操作平均是固定时间复杂度,哪怕列表里存的是长文本字符串,也不会产生额外的性能开销
- 遍历过程中同步维护从1开始的递增标签序号:碰到已经在字典里缓存过的元素,直接取出对应标签追加到结果里;碰到第一次出现的新元素,就把当前的标签值存入映射,再把标签序号加1
可直接复用的参考代码
def assign_sequential_tags(input_list): tag_mapping = {} next_tag = 1 result = [] for item in input_list: if item not in tag_mapping: tag_mapping[item] = next_tag next_tag += 1 result.append(tag_mapping[item]) return result
实际效果验证
用题目给出的示例输入测试:
input_sample = ['hi you', 'hello', 'hi you', 'hello', 'good bye'] print(assign_sequential_tags(input_sample)) # 运行输出:[1, 2, 1, 2, 3]
性能避坑提示
不要图省事用普通列表存已经出现过的元素,每次靠遍历列表查找当前元素是否存在的写法,整体时间复杂度是平方级的。当输入列表长度达到万级以上时,会出现非常明显的运行延迟;而上面的字典缓存方案是线性时间复杂度,哪怕处理几十万条的长字符串列表也能保持很高的运行速度。
内容的提问来源于stack exchange,提问作者Ted Vu
相关产品推荐
相关产品推荐

