大家好我对python.i很新,试图从网上编码网站解决这个问题
A = 3,B = 5
表A = 3,6,9,12,15,18等
表B = 5,10,15,20等等
合并后:3,5,6,9,10,12,15,15,18,20等等
删除重复项:3,5,6,9,10,12,15,18,20等等
对于N = 2,超级表面的第二元素是5
问题是我可以得到有限范围的A和B的答案但是当我为10 ^ 9元素执行时我得到了内存错误。
from array import *
import itertools
array1=[]
array2=[]
A=int(input())
B=int(input())
N=int(input())
for i in range(0,10**9):
try:
array1.append(i+1 * A)
except MemoryError :
break
for j in range(0,10**9):
try:
array2.append(j+1 * B)
except MemoryError :
break
filter(None ,array1)
filter(None ,array2)
array3 = array1 + array2
array3 = sorted(set(array3))
print (array3[N])
追踪(最近的呼叫最后):
文件“C:/ Users / Clinton D / Desktop / supertables.py”,第21行,中
array3 = array1 + array2
的MemoryError
答案 0 :(得分:2)
如果您确实需要使用此大型数据集,则应使用pandas或numpy来处理它。
但如果您正在尝试解决编码高尔夫问题,请尝试使用较小的数据集来测试您的方法。无论如何,您可以考虑使用迭代器而不是列表,并使用iterator.chain来连接迭代器。
from itertools import chain
A=int(input())
B=int(input())
N=int(input())
array_a = (i*A for i in range(10**4))
array_b = (i*B for i in range(10**4))
array_c = chain(array_a, array_b)
c = sorted(set(array_c))
print(c[N])
答案 1 :(得分:0)
正如已经指出的那样,你在内存中制作了一些非常大的列表。我还发现你真的期待MemoryError令人惊讶!您的问题的一部分将通过使用列表推导来解决,这些是告诉Python如何构建列表而不必使用for循环和追加的方法。例如,前100个数字的平方的列表理解可以写为:
squares = [x*x for x in xrange(100)]
列表推导由两部分组成:元素定义和应用它的可迭代集。在前面的示例中,x * x是元素定义,xrange(100)中的x是可迭代部分。
现在回到你的问题。从你的代码中得到的第二件事是使用数组模块,而不需要任何特殊内容。
最后,使用filter(None,[...])可以消除每个求值为False的元素,对于数字为0,在你的例子中,任何列表中都没有这样的元素,除非A或B为0。
所以你的脚本应该按照以下方式结束:
A = int(input())
B = int(input())
N = int(input())
array1 = []
array2 = []
if A:
array1 = [i * A for i in xrange(1, 10**7 + 1)]
if B:
array2 = [i * B for i in xrange(1, 10**7 + 1)]
array1.extend(array2)
del(array2) # not entirely necessary, if you have 128GB RAM or more...
array1 = sorted(set(array1))
print array1[N-1]
在我脑海中出现的一些事情,直到我完成了我的计算机测试你的代码,是你可以使用生成器来解决这个问题。我现在完全确定了。另外,为什么你想要一到二十亿个元素?
我认为你的问题不是与Python或内存不足有关的东西,而是计算这些值的可怕算法 - 我只是稍微不那么糟糕。
修改强>
答案 2 :(得分:0)
您不想提前创建整个列表(例如,如果您只想找到第N个值,为什么要创建所有这些值?)
你想要做的是这样的事情:
def f(n):
vals = (x for x in xrange(1, 10**9) if (x % 3 == 0) or (x % 5 == 0))
for _ in xrange(n - 1):
vals.next()
return vals.next()
你只是在这里迭代,所以没有大的列表创建。