我目前正在寻找生成具有特定位数的数字列表,我的代码当前如下:
| 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 位数字文件)?
也许某种递归? (我仍然不明白如何编写递归函数等。在一般编程方面我是一个菜鸟)
最佳答案
只需按其预期用途使用迭代器...迭代器的全部要点是不要将所有内容立即存储在内存中...
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))
关于Python itertool 变体,达到内存最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31660477/