1

我目前正在寻找具有特定位数的数字列表,我的代码目前如下:

| Python 2.7 |

import itertools

inp = raw_input('Number of digits to write?:')
inp = int(inp)
inp2 = raw_input('File name?:')
inp2 = inp2 + '.txt'
variants = ["".join(item) for item in itertools.product("0123456789", repeat=inp)]

variant = open(inp2, 'w')

for number in variants:
    variant.write("%s\n" % number)

如您所见,我正在尝试生成多个不同的文件,并为每个新数字逐行放置输出。

我知道该列表可能有问题,因为它将所有可能的数字存储在该列表中的内存中。我的问题是:由于数字超过 7,存在内存问题,我将如何减少所需的内存或将多个文件放在一起以生成具有相同类型数据的列表。

如果不使用这个特定的 itertools 实现,for 循环是否可以在本质上将两个列表“附加”在一起(比如 4 位文件和 5 位文件以创建一个 9 位文件)?

也许某种递归?(我仍然不明白如何编写递归函数等。在一般编程方面,我是个菜鸟)

4

2 回答 2

2

只需按照预期使用迭代器......迭代器的全部意义在于不要一次将所有内容存储在内存中......

variants = itertools.product("0123456789", repeat=inp)

variant = open(inp2, 'w')

for number in variants:
    variant.write("%s\n" % (" ".join(number))

或者,您可以使用在功能上等效的生成器

variants = ("".join(item) for item in itertools.product("0123456789", repeat=inp)) #now its a generator expression


with open("outfile","wb") as variant:
    for number in variants:
        variant.write("%s\n"%number)

正如指出的那样,您可以更轻松地做到这一点

max_value = 10**n
with open("outfile","wb") as variant:
    for number in xrange(max_value):
        variant.write("{0:09d}\n".format(number))
于 2015-07-27T18:29:20.470 回答
1

构建variants列表时,您将所有字符串都放入内存中。当您在内存中有 10^7 或更多字符串时,您将开始用尽它是有道理的。您要做的是遍历迭代器并一次写出一个字符串。这在您获得输入后开始。

variants = itertools.product('0123456789',repeat=inp)
outfile = open(inp2,'w')
for group in variants:
   outfile.write("%s\n" % (''.join(group)))
于 2015-07-27T18:29:39.757 回答