如何生成1-45范围内无重复数字的5数组合?
生成1-45无重复5数组合的解决方案
你遇到的问题根源是用错了itertools里的方法:combinations_with_replacement本身就是允许元素重复选取的组合生成器,所以才会出现像(34,34,34,35,37)这种重复数字的组合。要生成无重复元素的组合,直接用combinations方法就行,它会自动生成所有不重复的元素组合(组合内元素无序且唯一)。
修改后的代码
from itertools import combinations import sys # 生成1到45中取5个不重复数字的所有组合 c = combinations(range(1, 46), 5) # 用range(1,46)替代手动写列表,更简洁 # 注意:sys.getsizeof(c)获取的是迭代器对象的内存大小,不是组合总数 print(f"迭代器对象内存大小: {sys.getsizeof(c)}") # 处理组合并写入文件,每个组合占一行更易读 with open("sample.txt", "w") as file: # 遍历每个组合,转成字符串后加换行写入 for combo in c: file.write(f"{combo}\n") # 可选:如果需要打印部分结果,可重新生成迭代器(因为迭代器只能遍历一次) # for combo in combinations(range(1,46),5): # print(combo)
关键改动说明
- 替换生成方法:把
combinations_with_replacement换成combinations,后者默认生成无重复元素的组合。 - 简化列表生成:用
range(1,46)替代手动写1到45的列表,代码更简洁且不易出错。 - 优化文件写入:使用
with语句自动管理文件句柄(避免忘记close),同时每个组合单独占一行,输出文件可读性更强。 - 修正注释错误:原代码注释写的是"get all combinations of 1, 2, nad length 10",已经修正为符合实际需求的注释。
补充说明
combinations生成的组合是无序的,比如(1,2,3,4,5)和(5,4,3,2,1)会被视为同一个组合,只会生成一次。如果需要有序的排列(即考虑顺序的情况),可以用permutations方法,但注意排列的数量会远多于组合。- 迭代器只能遍历一次,所以如果既想写入文件又想打印结果,需要重新生成一次迭代器,或者先把所有组合转成列表存储(但1-45取5的组合总数是1,221,759个,转成列表会占用较多内存,建议按需遍历)。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

