You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:59:41