Python Bag集合去重异常排查与课程作业代码补全
问题修复方案
1. removeDuplicates去重仅能删除一半重复项问题
根因
直接在遍历Bag实例的过程中调用remove()修改后备存储,会导致迭代器游标错位:每删除一个元素,后续元素的索引/链表节点会自动前移,但迭代器游标仍按固定步长向后移动,会直接跳过紧邻的重复元素,最终只能移除约一半的重复项,同时还可能触发迭代器并发修改异常。
修复代码
def removeDuplicates(input_bag): # 第一步:遍历导出所有元素到临时列表,迭代过程不修改原Bag temp_storage = [] for item in input_bag: temp_storage.append(item) # 第二步:清空原Bag input_bag.clear() # 第三步:遍历临时列表,将未出现过的元素重新加回原Bag appeared = set() for item in temp_storage: if item not in appeared: appeared.add(item) input_bag.add(item)
前置要求:自定义
Ball类必须实现__eq__和__hash__方法,基于球的颜色、半径属性判断实例相等性,否则默认按内存地址判重会导致相同属性的球被识别为不同对象,去重失效。
2. distributeBag函数逻辑补全
实现逻辑
严格遵守迭代规则,先导出原袋所有元素到临时容器再清空原袋,避免迭代过程中修改原袋后备存储触发异常,之后逐个处理球对象:红球半径翻倍后移入redBag,蓝球直接移入blueBag,操作完成后原袋保持空状态。
实现代码
def distributeBag(origin_bag, redBag, blueBag): # 导出原袋所有球到临时列表 temp_balls = [] for ball in origin_bag: temp_balls.append(ball) # 清空原袋 origin_bag.clear() # 逐个处理球分类 for ball in temp_balls: if ball.color == "red": ball.radius *= 2 redBag.add(ball) elif ball.color == "blue": blueBag.add(ball)
验证标准
函数执行完成后满足三个条件:
- 原Bag调用
isEmpty()返回True - redBag中所有红球的半径为原袋中对应红球半径的2倍,无蓝球混入
- blueBag中包含原袋所有蓝球,无红球混入
内容的提问来源于stack exchange,提问作者Ashton Baker2
相关产品推荐
相关产品推荐

