如何生成多罐取球的所有组合列表:20球罐取3+两5球罐各取1
解决方案
这问题正好可以用Python的itertools模块轻松搞定,核心思路是先分别生成每个罐子的取球组合,再把它们的所有可能搭配组合起来。
具体实现步骤
- 首先导入
itertools模块,它提供了专门处理组合、笛卡尔积的工具函数; - 针对20球的罐子,用
combinations(range(1,21), 3)生成所有取3个球的组合; - 对两个5球的罐子,分别用
combinations(range(1,6), 1)生成取1个球的所有组合(当然也可以直接用range(1,6),不过用combinations能保证返回格式是元组,和前面的结果更统一); - 最后用
itertools.product把这三个组合集合做笛卡尔积,就能得到所有跨罐子的取球组合了。
完整代码示例
import itertools # 生成20球罐取3个的所有组合 jar_20 = itertools.combinations(range(1, 21), 3) # 两个5球罐各取1个的组合 jar_5_1 = itertools.combinations(range(1, 6), 1) jar_5_2 = itertools.combinations(range(1, 6), 1) # 生成所有可能的跨罐组合,每个元素是(20球的3元组, 第一个5球的1元组, 第二个5球的1元组) all_combos = itertools.product(jar_20, jar_5_1, jar_5_2) # 如果想把每个组合合并成一个单一的元组(比如把取出的5个球放在一个元组里),可以用这个生成器 flattened_combos = (combo_20 + combo_5a + combo_5b for combo_20, combo_5a, combo_5b in all_combos) # 转换成列表查看结果(总共有 1140*5*5=28500 个组合,内存完全没问题) result = list(flattened_combos)
额外说明
itertools.product的作用就是把多个可迭代对象的所有元素进行配对,完美匹配我们“从三个罐子分别取球的所有组合”的需求;- 如果不需要区分每个罐子的取球结果,直接拼接元组就能得到一个包含所有取出球的单一元组;
- 要是你处理的是更大规模的数据集,建议保留迭代器形式(不用转成列表),这样能节省内存。
内容的提问来源于stack exchange,提问作者user2505650
相关产品推荐
相关产品推荐

