【问题标题】:Memory Error When Generating List of Odd Numbers生成奇数列表时出现内存错误
【发布时间】:2016-06-30 16:43:21
【问题描述】:

请看下面的代码。它制作了一个从 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 开头的奇数三角形的解决方案。

【问题讨论】:

  • 我对这段代码感到非常困惑。这段代码只是试图对out 的第 9 个元素求和(一旦代码到达那里,这实际上将是一个错误)。但是out 只是同一个列表。您正在内存中创建一个巨大的列表,然后直接将其复制到内存中的另一个 ENORMOUS 列表。你到底想做什么?整个代码可以替换为print(19)
  • 对我来说听起来像XY Problem。我同意摩根,你的最终目标是什么?样本输入/输出
  • 但是,说了这么多,是的,如果您尝试创建一个包含 500 亿个项目的列表,则会出现内存错误。
  • 那么,f = lambda lst, n: sum(lst[n-1])? 500 亿个数字列表与此有什么关系?
  • 请使用该信息更新您的问题。这很有帮助。

标签: python list function python-3.x


【解决方案1】:

由于这是一个挑战,我会为您指明正确的方向:

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

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

如果我想要第 4 行,它从列表中的第 7 个数字开始,到第 10 个数字结束。有没有办法,对于线 n,找出 start 数字和 end 数字是什么。那你就不用把树存储在内存中了,只需要计算出开始和结束的数字,然后相加即可。

【讨论】:

  • i = sum(range(1, n+1)) m = i - (n-1) p = sum(range(m, i + 1)) return p
  • 这是你的尝试吗?用您尝试过的方法和遇到的问题更新您的问题。
【解决方案2】:

对于奇数三角形,在第 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) ])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    相关资源
    最近更新 更多