Python练习set集合操作触发KeyError:1错误,求原因及解决方法
报错原因
- 集合
pop()方法的特性:Python中存储小整数的集合执行pop()时,会优先移除最小的元素。你的初始集合为{1,2,3},执行第一条pop命令时就已经把元素1从集合中删除。 - 集合
remove()方法的特性:remove()要求被移除的元素必须存在于集合中,元素不存在时会直接抛出KeyError异常。你执行remove 1时元素1已经被删除,因此触发报错。 - 命令判断逻辑存在缺陷:你通过输入字符串长度是否为3判断是否执行
pop,这种判断方式非常不稳定,只要输入的字符串长度为3就会触发pop,如果遇到其他长度为3的命令、或者pop前后带空格的情况,都会导致逻辑错误。
修复方案
将命令判断逻辑改为先拆分输入行取指令名判断,同时可以根据需求选择是否在remove前做存在性校验,修正后代码如下:
n = int(input()) s = set(map(int, input().split())) N = int(input()) for i in range(N): cmd_parts = input().split() cmd = cmd_parts[0] if cmd == 'pop': s.pop() elif cmd == 'remove': val = int(cmd_parts[1]) # 方式1:先判断元素存在再调用remove,避免报错 if val in s: s.remove(val) # 方式2:直接用discard,元素不存在也不会抛异常,可替换上面两行 # s.discard(val) elif cmd == 'discard': val = int(cmd_parts[1]) s.discard(val) # 其他命令可以在这里扩展
如果你完全不需要元素不存在时的报错提示,直接统一用discard()方法替代remove()即可,不需要额外做存在性判断。
内容的提问来源于stack exchange,提问作者Zhengxi Jiang
相关产品推荐
相关产品推荐

