生成奇数列表时出现内存错误

时间:2016-06-30 16:43:21

标签: python list function python-3.x

请查看以下代码。它列出了从1到100的所有奇数。然后它将该列表并将其分块到子列表中,每个子列表一个元素大于最后一个。

mylist = list(range(1, 100, 2))
out = []
i = 1 # Start off with size 1, because we don't care about the initial empty list
tri = 0
while tri+i < len(mylist):
    tri = i*(i+1)//2 # Get sum of 0+1+2+..+i
    out.append(mylist[tri-i:tri])
    i+=1
print(out)

我想使用此代码创建一个函数,该函数接受一个输入(n),该输入将对应于新的子列表(out)的第(n-1)个索引,并对该子列表中的所有元素求和。我已经接受了输入n并将其提升到自身的强度加上1(n **(n + 1)),但是我经常在n = 5之后得到内存错误。这是我的实验代码产生错误。

n = 10
mylist = list(range(1,n**(n+1), 2))
out = []
i = 1
while len(mylist):
    out.append(mylist[:i])
    mylist = mylist[i:]
    i+=1
print(sum(out[n-1]))

Traceback (most recent call last):
  File "python", line 2, in <module>
MemoryError

编辑(澄清信息):我想创建一个函数,当给定输入(n)时,它将转到该子列表列表的n-1索引并对列表的元素求和。我正在研究一个python挑战问题,它被呈现为奇数的数字三角形,其中金字塔的顶部是1,然后下一行是3和5,依此类推。因此,如果给定n,则转到三角形中的第n行并对该行的数字求和。希望这有助于解释。

编辑2:要获得以1开头并以1递增的数字三角形的第n行的总和,以下代码通过测试。但是,对于由所有奇数,所有偶数或任何非单一递增数字序列组成的数字三角形,这不起作用:

def triangle_row_sum(n):
    last_in_row = sum(range(1, n+1)) 
    first_in_row = last_in_row - (n-1) 
    p = sum(range(first_in_row, last_in_row + 1)) 
    return p

但是,我仍在研究以1开头的奇数三角形的解决方案。

2 个答案:

答案 0 :(得分:2)

由于这是一项挑战,我将指出正确的方向:

您不需要将三角形存储在内存中。你想要的是弄清楚如何计算指定行三角形中的数字:

1)    1
2)   2 3
3)  4 5 6
4) 7 8 9 10

如果我想要第4行,则从列表中的第7个数字开始,以第10个结尾。行n是否有办法确定start数字和end数字是多少。然后你不必将树存储在内存中,你可以只计算起始和结束数字,然后将它们加起来。

答案 1 :(得分:0)

对于奇数的三角形,在第n行,第一个数字将是n *(n-1)+1。之后,您可以轻松地在该行中生成n个奇数的序列并将它们相加。

sum([n*(n-1)+1+2*i for i in range(n) ])

这将为您提供奇数三角形中第n行的总和。

对于偶数的三角形,第n行的总和将是

sum([n*(n-1)+2*i for i in range(n) ])