如何在Python中重命名重复字符串?将重复串替换为对应整数
解决列表重复字符串替换为递增整数的问题
首先,咱们先看看你原来的代码为什么达不到预期效果:
Counter确实能统计每个元素的出现次数,但mylist.index(s)只会返回第一个匹配项的索引,所以你每次只替换了第一个出现的重复元素。- 而且你把所有重复元素都硬设成了1,没有实现按出现顺序分配递增的数字。
要实现你想要的效果——重复项按首次出现的顺序对应1、2、3...,咱们可以用一个字典来跟踪每个重复字符串对应的数字,同时遍历整个列表逐个替换。
完整实现代码
mylist = ["name", "state", "name", "city", "city", "name", "zip", "zip", "name"] from collections import Counter # 先统计每个元素的出现次数,判断哪些是重复项 counts = Counter(mylist) # 用字典存储重复字符串对应的数字 str_to_num = {} current_num = 1 # 遍历列表,逐个处理元素 for idx, item in enumerate(mylist): # 只处理出现次数>1的元素 if counts[item] > 1: if item not in str_to_num: # 首次遇到该重复项,分配当前数字,然后数字递增 str_to_num[item] = current_num current_num += 1 # 替换为对应的数字 mylist[idx] = str_to_num[item] print(mylist) # 输出结果:[1, 'state', 1, 2, 2, 1, 3, 3, 1]
代码解释
- 统计出现次数:用
Counter先找出所有重复出现的元素(出现次数>1),避免处理只出现一次的元素(比如示例里的state)。 - 跟踪数字映射:
str_to_num字典用来记录每个重复字符串对应的整数,确保同一个字符串对应同一个数字。 - 遍历替换:用
enumerate遍历列表的索引和元素,遇到重复项时,先检查字典里有没有对应的数字,没有就分配当前的current_num并递增,然后替换列表中的元素。
这样就能完美实现你想要的效果:name对应1,city对应2,zip对应3,后续新增的重复项也会依次分配4、5、6...
内容的提问来源于stack exchange,提问作者user10669698
相关产品推荐
相关产品推荐

