2012-07-23 82 views
1

我正在做项目欧拉的挑战,以获得更好的Python(我是一个初学者),我正在尝试做Problem 9作为一个列表变量存储范围()的结果 - Python

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] 

等 任何帮助将不胜感激,谢谢:)

+4

Protip:为变量使用有意义的名称。 – 2012-07-23 21:01:55

回答

3

要生成值从1到1000,你需要指定结束值1000 + 1,即1001所以

liasta = range(1, 1001) 

会给你从1的值的列表1000。

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

三个例子:

>>> 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] 
+0

它给出了错误 回溯(最近通话最后一个): 文件 “euler9.py”,10号线,在 lista.pop(-1) IndexError:从空列表弹出:/ – cjm 2012-07-23 21:05:09

+0

@ c3ns0r3d你做这些在'while'循环之前调用'lista = range(1,1001)'等等?如果按照我在答案中显示的方式创建“lista”,则可以毫无问题地确保“lista.pop(-1)”。 – Levon 2012-07-23 21:07:03

+0

是的,他们与文件顶部的变量 – cjm 2012-07-23 21:08:49

1

使用此为您的代码:

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

不要这样做:

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

因为如果你的pop一切都工作在相同的列表。

0

虽然你的问题是问如何在一个范围内的数字列表,我想请教您一个问题回:

Do you actually need three lists of numbers or do you just need to look through the possible values for a solution?

我问,因为尽管你可以得到你寻找答案,它不是最好的表达你的方式。例如:

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

+0

优雅!如果我有足够的代表upvote,我会:) – cjm 2012-07-23 22:08:37