如何去除列表中顺序不同的重复勾股三元组?
解决勾股三元组重复输出的问题
你的代码会生成顺序不同的同一组勾股三元组,核心原因是i和j的循环范围重叠,导致(i,j,k)和(j,i,k)都会被遍历到。下面提供两种简单的解决思路:
思路1:从循环源头避免重复
直接调整循环条件,让j从i+1开始,保证i < j,同时利用勾股定理的特性(k必然大于j,因为i²+j²=k²且i>0),可以进一步优化计算逻辑,减少不必要的循环:
SpecialTriangles = [] for i in range(1, 15): # 从1开始,直接排除0的情况 for j in range(i + 1, 15): # j始终大于i,避免生成(i,j)和(j,i)的重复组合 k_squared = i**2 + j**2 k = int(k_squared ** 0.5) # 检查k是否在范围内且是整数(避免平方根取整后的误差) if k < 15 and k**2 == k_squared: SpecialTriangles.append([i, j, k]) print(SpecialTriangles)
运行后直接输出升序的唯一三元组:
[[3, 4, 5], [5, 12, 13], [6, 8, 10]]
思路2:排序后去重(兼容原有代码结构)
如果不想大幅修改原有循环逻辑,可以在添加三元组前先排序,再检查是否已经存在于列表中,避免重复添加:
SpecialTriangles = [] for i in range(15): for j in range(15): for k in range(15): if i**2 + j**2 == k**2: # 简化原有多条件判断,直接排除包含0的无效三元组 if i != 0 and j != 0 and k != 0: sorted_triple = sorted([i, j, k]) if sorted_triple not in SpecialTriangles: SpecialTriangles.append(sorted_triple) print(SpecialTriangles)
这种方法的好处是不用调整循环结构,但效率略低于第一种(因为会先生成重复组合再去重)。
内容的提问来源于stack exchange,提问作者anaveragenoobie
相关产品推荐
相关产品推荐

