You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何生成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)

关键改动说明

  1. 替换生成方法:把combinations_with_replacement换成combinations,后者默认生成无重复元素的组合。
  2. 简化列表生成:用range(1,46)替代手动写1到45的列表,代码更简洁且不易出错。
  3. 优化文件写入:使用with语句自动管理文件句柄(避免忘记close),同时每个组合单独占一行,输出文件可读性更强。
  4. 修正注释错误:原代码注释写的是"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 17:45:37