Python中为重复字典键添加后缀以保留所有键值对的方法
解决字典重复键覆盖问题:添加数字后缀保留所有条目
要实现你的需求,核心是先统计每个键的总出现次数,再根据次数决定是否添加数字后缀——只出现一次的键保留原名,多次出现的键按顺序添加数字后缀(从1开始)。
完整代码
items = ['name:John','age:25','Address:Chicago','Address:Phoenix','Address:Washington','email:John@email.com'] # 第一步:先统计所有键的总出现次数 key_total_counts = {} for item in items: raw_key = item.split(':')[0] key_total_counts[raw_key] = key_total_counts.get(raw_key, 0) + 1 # 第二步:遍历生成带唯一键的字典 result_dict = {} current_key_counter = {} for item in items: raw_key, value = item.split(':', 1) # split(':',1)避免值里包含冒号导致拆分错误 current_key_counter[raw_key] = current_key_counter.get(raw_key, 0) + 1 # 根据总次数决定键名 if key_total_counts[raw_key] == 1: result_dict[raw_key] = value else: result_dict[f"{raw_key}{current_key_counter[raw_key]}"] = value print(result_dict)
代码说明
- 统计总次数:先遍历一次列表,记录每个键总共出现多少次,以此判断哪些键需要加后缀。
- 生成唯一键:第二次遍历列表时,用
current_key_counter记录当前键已出现的次数,结合总次数处理:- 总次数为1的键直接使用原名
- 总次数大于1的键,拼接
原始键+当前次数作为新键,保证唯一性
- split(':',1):比单纯
split(':')更健壮,能避免值里包含冒号(比如Address:123 Main St:NY)导致的拆分错误。
运行结果
{'name': 'John', 'age': '25', 'Address1': 'Chicago', 'Address2': 'Phoenix', 'Address3': 'Washington', 'email': 'John@email.com'}
原代码问题分析
你之前用dic.update({j[0]:j[1]})的方式,每次遇到相同键都会直接覆盖之前的键值对,所以最后只会保留每个键的最后一次出现的值,这就是为什么你得到的Address只有最后一个Washington。
内容的提问来源于stack exchange,提问作者Sri
相关产品推荐
相关产品推荐

