我想将一定长度的所有base-26数字(字母表中的数字作为数字)写入ASCII文件。 对于长度= 4,这看起来像
aaaa
aaab
aaac
...
zzzx
zzzy
zzzz
我使用以下递归代码实现了这一点:
def fuz(data, ll_str):
ll_str += 1
def for_once(data_once, ll_str_once):
tmp_str = ll_str_once
tmp_str -= 1
new_data = []
for m in data_once:
for i1 in range(97, 123):
new_data.append(m + chr(i1))
if tmp_str != 0:
return for_once(new_data, tmp_str)
else:
return data_once
return for_once(data, ll_str)
if __name__ == '__main__':
ll = 4
test = ['']
file_output = open("out.txt", 'a')
out_data = fuz(test, ll)
for out in out_data:
file_output.write(out + '\n')
file_output.close()
然而,对于任何长度> 4,这个解决方案在我的机器上耗尽内存。
因此,我寻找一种没有递归的替代方案 - 任何人都可以给我一个如何做到这一点的提示吗?
答案 0 :(得分:0)
此循环将所有长度为4的基数为26(字母为数字)写入名为out.txt的文件中。 基数和长度可以任意选择 - 但准备耐心等待更高的价值......
import itertools as it
base = 26
lngth = 4
with open('out.txt', 'w') as f:
for t in it.product(range(97, 97+base), repeat=lngth):
s = ''.join(map(chr, (t)))
f.write(s + chr(13))
至少它没有按照OP的要求消耗太多内存。 然而,对于基数26,长度为5的文件已经有70MB而长度为6的文件我停止了1.4GB的写入过程; Notepad ++已经无法打开它了。所以每个人都可以自己考虑使用这个代码。