条件(a*a+b*b=c*c)在使用python的列表中满足

2024-03-29 10:31:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要知道列表中的元素是否满足条件 a*a + b*b = c*c,其中abc是以下列表中的任意元素:

original_list =[8,5,73,3,34,4,23,73]

在数学上,3*3 + 4*4 = 5*5,但不确定如何遍历python中的列表以满足该条件。你知道吗


Tags: 元素列表数学条件listoriginal
3条回答

这些问题更多地围绕着数学和算法而不是pythonisms。我在下面提出的解决方案在O(n**2)中具有复杂性。你知道吗

其思想是反转函数(x,y)=>;x*x+y*y,其中搜索空间是原始列表与其自身的叉积。然后,使用Python集操作符,计算应用程序图像和可接受的正方形之间的交集。最后,使用反向应用程序重建三胞胎。你知道吗

from collections import defaultdict

original_list = [8, 5, 73, 3, 34, 4, 23, 73]
uniq = sorted(set(original_list))

antecedents = defaultdict(lambda: []) # Reverse mapping
for i, left in enumerate(uniq):
    for right in uniq[i+1:]:
        key = left * left + right * right
        antecedents[key].append((left, right))
# The keys of antecedents are sum of squares

uniq_squares = set([ x * x for x in uniq ])
common_keys = uniq_squares & antecedents.keys()

for key in common_keys:
    sqrt = int(0.5 + key**0.5)
    key_antecedents = antecedents[key]
    for (left, right) in key_antecedents:
        print("Found triplet:", (left, right, sqrt))

您可以使用itertools.combinations迭代列表中的项目:

import itertools

for a, b, c in itertools.combinations(sorted(original_list), 3):
    if a*a + b*b == c*c:
        print("Pythagorean triple found:", a, b, c) # or whaver...

请注意,在将原始列表传递给combinations之前,我对其进行了排序。这确保了a <= b <= c。虽然我们并不真正关心ab的相对顺序,但是c不小于这两者的事实是你所做测试的先决条件。你知道吗

Python代码

[(a,b,c) for a in original_list for b in original_list for c in original_list if a*a+b*b==c*c]

输出:

[(3, 4, 5), (4, 3, 5)]

相关问题 更多 >