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

如何在Python中实现带子集最大大小限制的列表集合全划分?

实现限制子集大小的集合划分算法

当然有办法实现这个需求!我们可以先生成所有可能的集合划分,再通过过滤条件筛选出所有子集大小都不超过k的结果。下面是具体的Python实现思路和代码:

核心思路

  1. 生成所有集合划分:用递归的方式遍历所有可能的划分方式——每次取集合中的第一个元素,要么把它加入到已有划分的任意子集中,要么让它单独成为一个新子集,递归处理剩余元素。
  2. 过滤符合条件的划分:对每个生成的划分,检查其中所有子集的长度是否都≤k,只保留满足条件的划分。

代码实现

def generate_set_partitions(lst):
    # 递归生成所有集合划分
    if not lst:
        yield []
        return
    first_element = lst[0]
    # 递归处理剩下的元素
    for rest_partition in generate_set_partitions(lst[1:]):
        # 把第一个元素插入到每个已存在的子集中
        for i in range(len(rest_partition)):
            modified_partition = rest_partition[:i] + [rest_partition[i] + [first_element]] + rest_partition[i+1:]
            yield modified_partition
        # 把第一个元素作为单独的子集加入划分
        yield [[first_element]] + rest_partition

def filter_valid_partitions(lst, k):
    # 过滤出所有子集大小不超过k的划分
    return [
        partition 
        for partition in generate_set_partitions(lst) 
        if all(len(subset) <= k for subset in partition)
    ]

# 测试示例
if __name__ == "__main__":
    lst = [1, 2, 3, 4]
    k = 2
    valid_partitions = filter_valid_partitions(lst, k)
    
    # 按示例格式输出结果
    for idx, partition in enumerate(valid_partitions, 1):
        print(f"{idx} {partition}")

代码解释

  • generate_set_partitions:递归遍历所有可能的集合划分,确保不遗漏任何一种组合方式。
  • filter_valid_partitions:利用列表推导式和all()函数快速筛选出符合条件的划分,all(len(subset) <=k)确保划分里的每个子集都满足大小限制。

运行这段代码后,输出结果和你给出的示例完全一致。如果你的集合规模较大,递归可能会有性能瓶颈,这时候可以考虑改用迭代式的划分生成方法或者借助动态规划优化,但对于中小规模的集合,这个实现已经足够高效易用。

内容的提问来源于stack exchange,提问作者lollpang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 21:52:41