Python列表元素赋值失效求助——Codewars区间求和挑战
问题分析与解决
为什么thing[1] = thing2[1]不生效?
- 临时变量无关联:你在循环里执行
thing = list(thing)时,thing只是原元组的临时副本,和intervals里的原始元素没有绑定关系。原intervals存储的是不可变元组,修改这个临时列表的元素,根本不会影响原数组内容。 - 遍历中修改数组的隐患:嵌套循环里直接调用
intervals.remove(tuple(thing2))会改变原数组长度,导致后续遍历出现元素跳过、索引混乱的问题,逻辑彻底失控。 - 求和逻辑错误:最后求和循环里用
sum += thing[1] - thing[0],这里的thing是外层循环最后一次迭代的临时变量,不是当前遍历的thing3,计算结果完全错误。
正确实现思路
区间合并的标准解法是先排序再合并:
- 按区间起始值从小到大排序所有区间;
- 初始化合并列表,放入第一个区间;
- 遍历后续区间,和合并列表最后一个区间对比:
- 若当前区间起始值≤最后一个合并区间的结束值,说明重叠,更新结束值为两者最大值;
- 若无重叠,直接加入合并列表;
- 最后计算所有合并后区间的长度之和。
修正后的代码
def sum_of_intervals(intervals): if not intervals: return 0 # 按区间起始值排序 sorted_intervals = sorted(intervals, key=lambda x: x[0]) merged = [list(sorted_intervals[0])] for current_start, current_end in sorted_intervals[1:]: last_start, last_end = merged[-1] if current_start <= last_end: # 重叠则合并,更新结束值为较大值 merged[-1][1] = max(last_end, current_end) else: # 无重叠则添加新区间 merged.append([current_start, current_end]) # 计算总长度 total = 0 for start, end in merged: total += end - start return total
测试示例验证:
- 输入
[(1,5),(3,7)],合并后得到[[1,7]],总长度6,符合预期; - 输入
[[1,4],[7,10],[3,5]],合并后得到[[1,5],[7,10]],总长度4+3=7,结果正确。
内容的提问来源于stack exchange,提问作者brutalthebigone
相关产品推荐
相关产品推荐

