巨型字符串导致内存错误 - 替代?

时间:2017-11-17 04:15:21

标签: python

我试图创建一个非常庞大的递增9位数字列表(最坏的情况)。我的计划是这样的:

['000000001', '000000002' , ..............,'999999999']

我已经编写了代码。但是,只要我运行代码,我的控制台就会打印"Memory Error"消息。

这是我目前的代码:

HUGE_LIST = [''.join(i) for i in product('012345678', repeat = 9)

我知道这可能不是生成列表的最佳代码。因此,有人可以帮我找到解决这个记忆问题的更好方法吗?

我计划使用HUGE_LIST与用户输入进行比较。

示例:用户输入' 12345678'作为输入,然后我希望我的代码用HUGE_LIST声明该输入。

1 个答案:

答案 0 :(得分:0)

解决此类问题的最佳方法是完全避免使用内存密集型算法。在这种情况下,由于您的目标是测试特定字符串是否在列表中,因此只需编写一个函数来检查字符串是否满足列表中的条件。例如,如果您的列表包含9位数的所有序列,那么您的函数只需要检查给定输入是否是9位数的序列。

def check(string):
    return len(string) == 9 and all(c.isdigit() for c in string)

(实际上,给它一个比check更好的名字)。或者,如果您想要所有9位数的序列(其中没有一个是9,正如您当前定义HUGE_LIST的代码所示,您可以写

def check(string):
    return len(string) == 9 and all(c.isdigit() and c != '9' for c in string)

等等。

如果你不能写一个算法来决定一个字符串(或其他)是否在列表中,那么下一个最好的事情就是创建一个一次生成一个值的生成器。如果你已经有了列表理解,比如

HUGE_LIST = [<something> for <variable> in <expression>]

然后您可以通过用括号替换方括号将其转换为生成器:

HUGE_GENERATOR = (<something> for <variable> in <expression>)

然后,您可以使用string in HUGE_GENERATOR测试会员资格。请注意,执行此操作后,HUGE_GENERATOR将被(至少部分)消耗,因此您无法将其用于其他成员资格测试;如果你想再次测试,你将不得不重新创建它。