1

我正在挑战 Project Euler 以在 python 上做得更好(我是初学者),我正在尝试做Problem 9

vara = lista[-1]
varb = listb[-1]
varc = listc[-1]

while not(vara < varb < varc):
listb.pop(-1)
lista.pop(-1)
lista.pop(-1)
if ((vara * vara) + (varb * varb) == varc * varc):
    print vara, varb, varc
else:
listc.pop(-1)
if ((vara * vara) + (varb * varb) == varc * varc):
    print vara, varb, varc
else:
    listb.pop(-1)
    if ((vara * vara) + (varb * varb) == varc * varc):
        print vara, varb, varc
    else:
        lista.pop(-1)

我已经尝试了很多方法来让 lista/listb/listc 的值在 1 - 1000 之间,但它们似乎都没有真正起作用

lista = range(1, 1000)
lista = range[1, 1000]

ETC

4

3 回答 3

5

要生成从 1 到 1000 的值,您需要将结束值指定为 1000 + 1,即 1001。所以

Python 2.x

# python 2.x
liasta = range(1, 1001)

Python 3.x

# python 3.x
liasta = list(range(1, 1001))

将为您提供从 1 到 1000 的值列表。

range()使用半闭区间,这意味着它包含它生成的值列表中的第一个值,但不包括最后一个值。请注意,如果您不指定起始值,range()则默认为0. 您还可以指定一个增量值,1除非另有说明,否则默认为。

文档页面中的三个示例:

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> range(1, 11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

>>> range(0, 30, 5)
[0, 5, 10, 15, 20, 25]
于 2012-07-23T20:58:37.293 回答
1

将此用于您的代码:

lista = range(1, 1001)
listb = list(lista)
listc = list(lista)

不要这样做:

lista = listb = listc = range(1, 1001)

因为那样你pop的 s 都在同一个列表上工作。

于 2012-07-23T21:04:18.000 回答
0

尽管您的问题询问如何在一个范围内制作数字列表,但我想问您一个问题:

您真的需要三个数字列表,还是只需要查看解决方案可能值?

我问是因为虽然你可以得到你所寻求的答案,但最好用你的方式表达。例如:

for c in range(1, 1001):
    for b in range(1, c):
        for a in range(1, b):
             if is_pythagorean_triple(a, b, c):
                 ...

def is__pythagorean_triple(a, b, c):
    ...

不创建任何列表(至少没有您需要考虑的)。另一个问题是为什么a范围只达到b?

于 2012-07-23T21:20:11.887 回答