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

条件(a*a+;b*b=c*c)在使用python的列表中满足,python,python-3.x,list,mathematical-expressions,Python,Python 3.x,List,Mathematical Expressions,我需要知道列表中的元素是否满足条件 a*a+b*b=c*c,其中a、b和c是以下列表中的任意元素: original_list =[8,5,73,3,34,4,23,73] 从数学上讲,3*3+4*4=5*5,但不确定如何在python中遍历列表以满足该条件。您可以使用itertools对列表中的项目进行迭代。组合: import itertools for a, b, c in itertools.combinations(sorted(original_list), 3): if

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

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

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

您可以使用
itertools对列表中的项目进行迭代。组合

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...
请注意,在将原始列表传递给
组合之前,我对其进行了排序。这确保了
aPython代码

[(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)]

这些问题更多地围绕着数学和算法,而不是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))

可能是你为解决这个问题所做的尝试的重复?你遇到了什么问题?因此,这不是一项完成家庭作业的服务。方法不错,但请注意,如果列表中的数字小于1,这可能不会像预期的那样起作用。@Kasramvd:Hmm,说得好。我认为用
key=abs
排序应该可以做到这一点,尽管我怀疑否定不太可能是有效的输入。只是通过将“否定”改为“少于一”来编辑注释(是的)。如果它是整数,那么使用
key=abs
就可以实现另一个目的,可能是一个更复杂的键函数,它也可以处理类似
0.5*0.5+0.1*0.1==0.26
的情况;我不知道公式,但我运行了两个测试:时间python-c'来自itertools导入组合I=0,用于a、b、c的组合(范围(1000),3):I+=1打印(I)“166167000 python-c 15.44s用户0.01s系统99%cpu 15.466总计,具有更好的格式:
python-m timeit-n 1-s”,来自itertools导入组合;i=0''表示a,b,c的组合(范围(1000),3):i+=1''打印(i)
1个循环,每个循环最好3:8.43秒
尝试使用长度超过10个数字的列表。如果ram是一个问题,您可以使用生成器,而不是列表
((a,b,c)表示原始列表中的a,表示原始列表中的b,表示原始列表中的c,如果a*a+b*b==c)
你能给我解释一下默认dict吗?是不是因为python通过引用传递,所以每次都会创建一个不同的空列表?@JoshuaNelson python从不通过引用。你可以只做
defaultdict(list)
,因为
list()
已经返回
[]
>a={}
>def(d):
。。。d['test']=True
>>f(a)
>a[“测试”]
True@JoshuaNelson这并没有演示引用调用语义。这将是:
>>a='foo'
>>def(&x):
。。。x='bar'
..>>f(a)
>a
关键是调用方可以看到引用的赋值。