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的其他方法,但我想知道为什么这只打印一个三元组。 我对此非常陌生。
答案 0 :(得分:1)
您的逻辑只迭代(x, x+1, x+2)
形式的元组子集。
在您提供的范围内,只有(3, 4, 5)
符合此标准,并且是毕达哥拉斯三重奏。
答案 1 :(得分:1)
问题已在this answer中描述。
快速解决方法是使用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)
不会出现在那里 - 你可以添加那些重复的'如果你需要它们的话......