如何获取30位由大写I和小写l组成的所有字符串组合?
解决用itertools.product生成I/l组合字符串的问题
嘿,我懂你遇到的问题啦!你用itertools.product写的代码思路是对的,但为啥只得到一个生成器对象的输出呢?这是因为itertools.product返回的是惰性生成器——它不会直接把所有组合都生成好存在内存里,而是等你迭代它的时候才逐个产出结果。直接打印生成器只会显示它的内存地址,不会输出具体的字符串组合。
正确的处理方式
要拿到具体的字符串,你需要遍历这个生成器,把每个产出的元组(product返回的是每个元素组成的元组,比如('I', 'l', 'I', ...))拼接成字符串。这里有两种常见的做法:
1. 逐个遍历并处理(推荐)
30位的I/l组合总共有2^30 = 1073741824个(超过10亿个),一次性把所有组合存进列表会占用巨大的内存(大概30GB以上),所以逐个处理是更合理的选择:
import itertools # 生成所有组合的生成器 combo_generator = itertools.product('Il', repeat=30) # 遍历生成器,把每个元组转成字符串并输出 for combo_tuple in combo_generator: combo_str = ''.join(combo_tuple) print(combo_str) # 如果需要写入文件,可以在这里添加写入代码,比如: # with open('combinations.txt', 'a') as f: # f.write(combo_str + '\n')
2. 转换为列表(不推荐,内存压力极大)
如果你真的需要把所有组合都存在内存里(非常不建议这么做,除非你的设备有足够内存),可以用list()把生成器转换成列表,但要做好内存占用的准备:
import itertools # 注意:这会生成10亿+个字符串,内存占用非常高! all_combinations = [''.join(combo) for combo in itertools.product('Il', repeat=30)] # 可以打印前几个看看效果 print(all_combinations[:5])
总结一下
itertools.product返回的生成器需要迭代才能取出元素- 30位组合的数量极其庞大,优先选择逐个处理的方式,避免内存溢出
- 用
''.join()把生成器产出的元组转换成你需要的字符串格式
内容的提问来源于stack exchange,提问作者Julian Guerra
相关产品推荐
相关产品推荐

