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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:24:23