Python:删除字典值列表中重复键元素及KeyError报错排查
解决字典值列表中移除自身键的KeyError问题
问题分析
你遇到的KeyError: 2完全是因为代码里的操作对象搞错了!咱们来拆解一下:你的需求是移除值列表中和当前键重复的元素,但你写的del cat_map[cat_map[k].index(item)]是在删除字典的键——而cat_map[k].index(item)返回的是值列表里重复元素的索引(比如2),你的字典根本没有名为2的键,这不就直接报错了嘛!
另外,原代码还有个隐藏问题:如果直接遍历值列表v的同时修改它,可能会导致遍历跳过某些元素,不过这不是这次报错的主要原因。
正确的解决方法
给你两种简洁可靠的方案,按需选择:
方案1:列表推导式(推荐)
这种方式最简洁,直接生成一个过滤掉重复元素的新列表替换原列表,完全避开遍历修改的坑:
cat_map = {'11-1': ['41-4', '43-1', '11-2', '43-6'], '11-2': ['41-4', '43-1', '11-2', '43-6'], '11-3': [], '11-9': [], '13-1': [], '13-2': [], '15-1': [], '15-2': [], '17-1': [], '17-2': [], '17-3': [], '19-1': [], '19-2': [], '19-3': [], '19-4': [], '21-1': [], '21-2': ['43-2', '33-9', '39-6', '39-9', '25-3', '39-3', '39-7'], '23-1': [], '23-2': [], '25-1': [], '25-2': [], '25-3': ['43-2', '37-1', '39-6', '25-3', '39-3']} for k, v in cat_map.items(): # 过滤掉所有和当前键k相同的元素 cat_map[k] = [item for item in v if item != k] # 验证结果:比如'25-3'的值列表已经去掉了自身 print(cat_map['25-3']) # 输出: ['43-2', '37-1', '39-6', '39-3']
方案2:遍历列表副本并移除元素
如果你更习惯用remove的方式,记得要遍历列表的副本,避免修改原列表时干扰遍历过程:
for k, v in cat_map.items(): # 遍历值列表的副本,这样修改原列表不会影响遍历 for item in v.copy(): if item == k: v.remove(item)
关键总结
- 核心错误:混淆了字典的键操作和值列表的操作——你要修改的是字典对应的值列表,不是字典本身的键;
- 遍历列表时尽量避免直接修改原列表,用列表推导式或者遍历副本是更安全的做法。
内容的提问来源于stack exchange,提问作者user9105277
相关产品推荐
相关产品推荐

