Python如何过滤a³+b³=c³+d³计算中元素相同顺序不同的重复解
解决方案
你遇到的重复问题本质是遍历逻辑没有限制排列顺序,导致同一个解的所有排列都会被记录,有两种常用的解决思路:
方法一:遍历阶段限制范围(推荐,效率更高)
从根源避免生成重复解,同时可以优化掉无意义的四重循环,代码如下:
interval = list(range(1, 16)) cube_sum_map = {} solutions = [] # 预存所有满足 a<=b 的数对对应的立方和 for a in interval: for b in interval: if a > b: continue s = a ** 3 + b ** 3 cube_sum_map.setdefault(s, []).append((a, b)) # 提取同一立方和下的不同数对组合,避免反向重复 for s, pairs in cube_sum_map.items(): if len(pairs) < 2: continue for i in range(len(pairs)): for j in range(i + 1, len(pairs)): p1, p2 = pairs[i], pairs[j] solutions.append([p1[0], p1[1], p2[0], p2[1]]) print(solutions)
运行后输出为 [[1, 12, 9, 10]],就是你需要的唯一解。
方法二:生成结果后标准化去重
如果你不想修改原有遍历逻辑,可以对已经生成的结果做标准化处理去重,代码如下:
# 保留你原有生成solutions的代码不变,新增以下去重逻辑 unique_set = set() for sol in solutions: # 对两个数对分别排序,再整体排序得到唯一的标准化形式 pair1 = tuple(sorted([sol[0], sol[1]])) pair2 = tuple(sorted([sol[2], sol[3]])) standard_form = tuple(sorted([pair1, pair2])) unique_set.add(standard_form) # 转换为列表格式输出 unique_solutions = [list(p1 + p2) for p1, p2 in unique_set] print(unique_solutions)
原理说明
- 方法一通过
a<=b的限制避免了同一两数组合出现正反两种排列,取数对时要求i<j避免了两个数对互换位置的重复,既减少了无效遍历,又直接得到唯一解,区间范围越大效率优势越明显。 - 方法二的核心是对每个四元组做标准化处理,不管四个数怎么排列,最终得到的标准化形式完全一致,利用集合的去重特性直接过滤重复结果。
内容的提问来源于stack exchange,提问作者user17156350
相关产品推荐
相关产品推荐

