python - 如何将此递归更改为循环
问题描述
我想将一定长度的所有 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,此解决方案会在我的机器上耗尽内存。
因此,我寻找一个没有递归的替代方案 - 任何人都可以给我一个提示如何做到这一点?
解决方案
此循环将所有长度为 4 的 base-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 的要求消耗太多内存。但是,对于 base 26,长度为 5 的文件已经有 70MB,长度为 6 的文件我在 1.4GB 处停止了写入过程;Notepad++ 已经无法再打开它了。所以大家可以自己想想这段代码的使用。
推荐阅读
- python - Color-Information 对 CNN 的作用/效果
- typo3 - 向typo3中的内容元素添加另一张图片
- java - 如何在android java中使用PixelCopy API从View中获取位图
- if-statement - 谷歌表格的vlookup中的嵌套IF函数
- php - 使用 PHP 从 XLSX 中提取图像或图表?
- amazon-web-services - 在 AWS Kinesis Analytics 中运行 Flink 时未生成 Kafka 指标
- javascript - 当有人加入服务器时,我的不和谐机器人不发送欢迎消息
- mongodb - 尝试连接 MongoDB Kubernetes 集群时 mongo-express 的身份验证问题(使用 MongoDB Community Kubernetes Operator 创建)
- anaconda - 在哪里可以找到适用于 anaconda 版本 4.6.11 的 Windows 安装程序
- maven - 如何在 JSF 2.3 项目中为 RichFaces 4.5.17.kcc5 和 Primefaces 7.0.RC3 设置 pom.xml