Python如何生成12元素列表拆分为3个任意大小子列表的所有方案
实现方法
核心思路
- 每个元素可以独立选择分配到3个子列表中的任意一个,总共有
3**12 = 531441种分配方案,和你预期的总数一致 - 用
itertools.product生成所有元素的组编号序列,再根据序列把元素分到对应子列表即可
完整代码
import itertools a = list(range(1, 13)) def generate_all_arrangements(items, group_count=3): # 生成每个元素的组编号所有组合 for assign in itertools.product(range(group_count), repeat=len(items)): groups = [[] for _ in range(group_count)] for item, group_idx in zip(items, assign): groups[group_idx].append(item) yield groups # 用法示例:遍历所有方案 all_arrangements = generate_all_arrangements(a) for arrangement in all_arrangements: # 这里可以添加你的处理逻辑,比如打印或者存储 print(arrangement)
说明
- 子列表内部元素按照原列表
a的顺序插入,符合你要求的「子列表内部顺序不影响唯一性」的要求,相同分组不会因为内部顺序生成重复结果 - 按照你注释里标注的
quarries, factories, markets三个不同类型的定义,三个组是有独立身份的,不需要额外去重,代码生成结果刚好覆盖所有3^12种组合;如果你认为三个子列表没有身份区别(比如[[1],[],[]]和[[],[1],[]]算同一种),可以在生成后对分组进行排序去重 - 建议直接遍历生成器处理结果,不要把所有方案一次性存入列表,避免占用过多内存
内容的提问来源于stack exchange,提问作者James O'Neill
相关产品推荐
相关产品推荐

