尝试向列表中添加列表时触发TypeError,求代码修正方案
Fixing TypeError When Inverting a Dictionary with Duplicate Values
我帮你找到了问题的根源,咱们来一步步解决它:
问题分析
你的代码在处理重复的字典值(也就是反转后的键)时犯了一个小错误:当new_key已经存在于new_dict中时,你用new_list.append(new_dict[new_key])把已有的列表整个当成一个元素添加到了新列表里。举个例子,处理{'ab': 'cd', 'bb': 'cd'}时,第一次处理ab会得到'cd': ['ab'],第二次处理bb时,你的代码会把['ab']作为单个元素加到['bb']里,变成['bb', ['ab']]。之后执行sorted(new_list)时,Python会尝试把字符串和列表做比较,这就触发了TypeError——不同类型的元素无法直接排序。
修正后的代码
我调整了代码逻辑,让它更直观且避免错误:
def inverse_dict(my_dict): new_dict = {} # 直接遍历原字典的键值对,命名更清晰 for original_key, original_value in my_dict.items(): if original_value in new_dict: # 如果反转后的键已存在,直接向对应列表添加原键 new_dict[original_value].append(original_key) else: # 不存在则创建新列表,存入当前原键 new_dict[original_value] = [original_key] # 对列表进行排序,保证输出有序 new_dict[original_value].sort() return new_dict def main(): print(inverse_dict({'cc': 'dd', 'ab': 'cd', 'bb': 'cd'})) print(inverse_dict({'b': 'd', 'c': 'd', 'a': 'd'}))
关键修改点
- 改用
my_dict.items()遍历键值对:相比你原来遍历键再取值的方式,直接获取original_key和original_value更易读,也避免了变量名混淆(你原来的new_value其实是原字典的键,容易让人误解) - 正确添加元素:当反转后的键已存在时,直接调用
append(original_key)把原字典的键添加到已有列表中,而不是把整个列表作为元素插入 - 即时排序:每次添加元素后对列表排序,确保输出的列表始终是有序状态
测试输出
运行main()函数后,会得到你期望的结果:
{'dd': ['cc'], 'cd': ['ab', 'bb']} {'d': ['a', 'b', 'c']}
内容的提问来源于stack exchange,提问作者user9576804
相关产品推荐
相关产品推荐

