我是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)
。
答案 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])
要详细了解itertools
和product
,请点击此链接 -
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)]