Python程序开发:统计列表中可构成三角形的三元组数量
解决Python统计三角形三元组数量的问题
首先,咱们可以先把判断三角形的check函数简化优化——其实判断三条边能否构成三角形,只需要较小的两条边之和大于最大边就足够了,因为最大边加任何一条边肯定大于第三条边,排序后就能轻松实现这个判断:
def check(a, b, c): sorted_sides = sorted([a, b, c]) return sorted_sides[0] + sorted_sides[1] > sorted_sides[2]
接下来是统计符合条件的三元组数量的核心部分:咱们需要统计列表中所有不重复的三元组组合(毕竟[2,3,4]和[3,2,4]是同一个组合,不能重复计数)。这里有两种常见实现方式:
方式1:使用itertools.combinations(简洁高效)
Python的itertools.combinations可以直接生成列表中所有长度为3的无序组合,不会重复,非常适合这个场景:
import itertools def check(a, b, c): sorted_sides = sorted([a, b, c]) return sorted_sides[0] + sorted_sides[1] > sorted_sides[2] def test(lst): valid_count = 0 # 遍历所有三元组组合 for trio in itertools.combinations(lst, 3): if check(*trio): valid_count += 1 return valid_count # 测试你的示例 print(test([1,1,3])) # 输出0 print(test([2,789,5,3,3237,4])) # 输出3
方式2:手动三重循环(直观易懂)
如果不想依赖标准库,也可以用三重循环手动生成组合,只要保证索引i < j < k,就能避免重复统计同一个组合:
def check(a, b, c): sorted_sides = sorted([a, b, c]) return sorted_sides[0] + sorted_sides[1] > sorted_sides[2] def test(lst): valid_count = 0 n = len(lst) # 三重循环,确保每个组合只被遍历一次 for i in range(n): for j in range(i + 1, n): for k in range(j + 1, n): if check(lst[i], lst[j], lst[k]): valid_count += 1 return valid_count
这两种方式都能完美匹配你给出的示例结果,你可以根据自己的需求选择使用~
内容的提问来源于stack exchange,提问作者Luke S.
相关产品推荐
相关产品推荐

