解决Python处理重叠区间时出现tuple不支持元素赋值的报错问题
报错根因
你虽然将入参的外层容器做了列表转换,但列表内存储的每个区间本身仍是不可修改的元组类型。嵌套循环中遍历拿到的y是元组,传入check_overlap函数后尝试直接修改元组的元素,就会触发'tuple' object does not support item assignment报错。
修复思路
- 放弃修改原有元组的逻辑,处理重叠时生成新的区间对象
- 补全所有重叠场景的处理逻辑,覆盖四类情况:
- 产品区间完全被品牌区间覆盖:直接丢弃该产品区间
- 产品区间完全包含品牌区间:拆分出不重叠的前后两段
- 产品区间左半部分和品牌重叠:保留右侧不重叠部分
- 产品区间右半部分和品牌重叠:保留左侧不重叠部分
修复后代码
def remove_overlapping_products(brand_positions, product_positions): result = [] for prod_start, prod_end in product_positions: current_start, current_end = prod_start, prod_end for brand_start, brand_end in brand_positions: # 无重叠直接跳过 if current_end < brand_start or current_start > brand_end: continue # 产品区间完全被品牌区间覆盖,直接丢弃 if current_start >= brand_start and current_end <= brand_end: current_start = current_end = None break # 产品区间完全包含品牌区间,拆分前半段保留,后半段继续校验 elif current_start < brand_start and current_end > brand_end: result.append((current_start, brand_start - 1)) current_start = brand_end + 1 # 产品左半段重叠,更新起始位置 elif current_start >= brand_start: current_start = brand_end + 1 # 产品右半段重叠,更新结束位置 else: current_end = brand_start - 1 # 处理后的区间合法则加入结果 if current_start is not None and current_start <= current_end: result.append((current_start, current_end)) return result
效果验证
输入示例:
print(remove_overlapping_products([(0, 10)], [(8, 23)]))
输出:
[(11, 23)]
和预期结果一致。
内容的提问来源于stack exchange,提问作者Márton Cséplő
相关产品推荐
相关产品推荐

