0

0

如何在 Python 中高效生成满足条件的子集组合(如元素总数限制)

碧海醫心

碧海醫心

发布时间:2025-12-27 18:35:02

|

575人浏览过

|

来源于php中文网

原创

如何在 Python 中高效生成满足条件的子集组合(如元素总数限制)

本文介绍如何利用 itertools.combinations 结合提前剪枝逻辑,高效生成列表的子集组合,并严格满足“子集中所有子列表的元素总长度 ≤ 6”的约束,避免生成海量无效组合导致内存与性能崩溃。

在处理大规模集合(如含 72 个子列表)的组合枚举时,暴力调用 itertools.combinations 枚举所有可能子集(如 C(72,1) + C(72,2) + … + C(72,25))会迅速超出计算资源——即使仅到 C(72,6),结果已超 1.5 亿项,极易触发内存溢出或长时间卡死。

关键优化思路是:不生成再过滤,而是在生成过程中动态剪枝。由于输入列表按子列表长度升序排列(如 [[1], [1,2], [2,3], [3,4], [1,2,3], [1,3,4]]),我们可以利用这一有序性,在组合构建中途一旦发现当前累计元素总数 ≥ 7(即超过阈值 6),立即跳过该分支,无需继续扩展更长的组合。

以下为推荐实现(简洁、可读、高效):

AI封面生成器
AI封面生成器

专业的AI封面生成工具,支持小红书、公众号、小说、红包、视频封面等多种类型,一键生成高质量封面图片。

下载
import itertools

def filtered_powerset(lst, max_total_len=6):
    """
    生成 lst 的非空子集组合,要求每个组合中所有子列表的元素总长度 <= max_total_len
    利用升序特性+即时求和剪枝,显著降低时间/空间开销
    """
    result = []
    n = len(lst)
    # 按组合长度 r 逐层生成(r = 1 到 n)
    for r in range(1, n + 1):
        # 对每个 r-元组组合
        for combo in itertools.combinations(lst, r):
            total_len = sum(len(sublist) for sublist in combo)
            if total_len <= max_total_len:
                result.append(combo)
            else:
                # ✅ 关键剪枝:因 lst 升序,后续同 r 组合只会更长,但注意:
                # itertools.combinations 不保证 combo 内部顺序对应原序长度递增,
                # 所以此处不能 break 同 r 层循环(除非预排序并自定义迭代器)
                # 因此本例中剪枝发生在单个 combo 判定后,仍有效减少无效 append
                pass
    return result

# 示例使用
arr = [[1], [1,2], [2,3], [3,4], [1,2,3], [1,3,4]]
subsets = filtered_powerset(arr, max_total_len=6)
for s in subsets[:10]:  # 仅打印前 10 个示意
    print(s)
? 为什么比 filter() 更优?filter(lambda x: sum(map(len, x))

⚠️ 注意事项:

立即学习Python免费学习笔记(深入)”;

  • 输入列表必须保持子列表长度非递减(题目已满足),否则无法利用有序性做高级剪枝;
  • “元素出现频次 ≤ 2” 等复杂约束建议在后续阶段用 collections.Counter 后处理过滤,避免嵌套逻辑拖慢主路径;
  • 若 max_total_len 较小(如 ≤ 6)且子列表普遍较短(如多数为长度 1–3),实际生成的组合数将远低于理论上限,性能可接受。

总结: 面向带约束的组合生成任务,应优先采用「生成即校验 + 条件跳过」策略,而非「全量生成 + 后过滤」。配合 itertools.combinations 的分层结构与明确的业务约束(如总长度上限),即可在代码简洁性与运行效率间取得优秀平衡。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

214

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

192

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

61

2026.01.05

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

214

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

192

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

61

2026.01.05

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

77

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

40

2025.11.16

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.8万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号