程序只返回一个毕达哥拉斯三元组


a = range(0,1001)
b = range(1,1001)
c = range(2,1001)
d = [(0,0,0)]
for x,y,z in zip(a,b,c) :
  if (x*x) + (y*y) == (z*z) :
    d.append((x,y,z))
    continue
print d

输出:

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

我找到了使用 def 和 iter 的其他方法,但我想知道为什么这只打印一个三元组。我是全新的。

这个问题已经在这个答案中描述过了。

快速解决方法是使用itertools.product

from itertools import product
a = range(0, 1001)
b = range(1, 1001)
c = range(2, 1001)
d = []
for x,y,z in product(a,b,c):
  print(x, y, z)
  if (x*x) + (y*y) == (z*z):
    d.append((x,y,z))
print(d)

。这是非常低效的!

这将更有效(没有经过很好的测试!

from math import sqrt
d = []
for z in range(1, 1001):
    z2 = z**2
    for x in range(1, z//2 + 1):
        x2 = x**2
        y = round(sqrt(z2 - x2))
        if x2 + y**2 == z2:
            d.append((x, y, z))

每个三元组只有一个条目;即只有(3, 4, 5)将在结果列表中; (4, 3, 5)不会在那里 - 如果需要,您可以单独添加这些"重复项"......

您的逻辑仅迭代形式为 (x, x+1, x+2) 的元组子集。

在您提供的范围内,只有(3, 4, 5)符合此标准,并且是毕达哥拉斯三元组。

最新更新