对毕达哥拉斯三重奏的列表理解

时间:2017-06-04 06:35:54

标签: python

我是Python新手,想学习如何使用列表理解。

我有这段代码打印的毕达哥拉斯三元组列表小于用户输入值n

n = int(input("Enter the value of n:"))

a = 0
b = 0
c = 0
m = 2
triples = []

while c < n:
    for i in range(1, m, 1):
        a = m*m - i*i
        b = 2*m*i
        c = m*m + i*i
        if c > n:
            break
        triples.append((a, b, c))
    m += 1

print(triples)

它有点有用但我想用Python中的列表理解来做同样的事情我们怎么做呢?

例如,如果我输入17,则输出应为[(3,4,5), (8,6,10),(5,12,13), (15,8,17), (9,12,15)]但是我没有得到(9,12,15)

2 个答案:

答案 0 :(得分:1)

看看official python documentation for list comprehensions,它解释了它们如何运作良好。

至于您的实际问题,以下内容应该是相同的列表理解,以打印出Pythagorean triples直至n

n = int(input("Enter the value of n:"))

print([(a,b,c) for a in range(1,n+1) for b in range(a,n+1) for c in range(b,n+1) if a**2 + b**2 == c**2])

希望你能清楚地了解当前代码中的问题:)

使用示例:

Enter the value of n: 17
[(3, 4, 5), (5, 12, 13), (6, 8, 10), (8, 15, 17), (9, 12, 15)]

答案 1 :(得分:0)

您可以使用itertools。试试这个 -

import itertools

n = int(input("Enter the value of n:"))

print([(a,b,c) for a, b, c in itertools.product(range(1,n+1), repeat=3) if a**2 + b**2 == c**2])

要详细了解itertoolsproduct,请点击此链接 - https://docs.python.org/3/library/itertools.html#itertools.product

使用product我们得到3个元素的元组,我们将它们解包为三个变量a,b,c和使用的理解,只包括那些满足if条件的元组。

但是,此代码会生成重复项,如(3,4,5)和(4,3,5)

要删除重复项,您可以轻松修改if语句 -

print([(a,b,c) for a, b, c in itertools.product(range(1,n+1), repeat=3) if a < b < c and a**2 + b**2 == c**2])

此修改后的代码将为您提供n=17 -

的输出
[(3, 4, 5), (5, 12, 13), (6, 8, 10), (8, 15, 17), (9, 12, 15)]