我试图创建一个非常庞大的递增9位数字列表(最坏的情况)。我的计划是这样的:
['000000001', '000000002' , ..............,'999999999']
我已经编写了代码。但是,只要我运行代码,我的控制台就会打印"Memory Error"
消息。
这是我目前的代码:
HUGE_LIST = [''.join(i) for i in product('012345678', repeat = 9)
我知道这可能不是生成列表的最佳代码。因此,有人可以帮我找到解决这个记忆问题的更好方法吗?
我计划使用HUGE_LIST与用户输入进行比较。
示例:用户输入' 12345678'作为输入,然后我希望我的代码用HUGE_LIST声明该输入。
答案 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
将被(至少部分)消耗,因此您无法将其用于其他成员资格测试;如果你想再次测试,你将不得不重新创建它。