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

如何基于集合字典自动生成所有无重复组合的交集及唯一值?

动态处理集合字典的组合交集与唯一值计算

核心思路

  • 用itertools.combinations生成所有非空集合组合(从单个集合到全部集合的组合)
  • 按组合元素数量从多到少处理,这样计算小组合的唯一值时,所有包含它的更大组合已经处理完毕,直接用当前组合的交集减去这些更大组合的交集即可
  • 最后整理成要求的元组列表格式

代码实现

import itertools

def process_set_dict(set_dict):
    keys = list(set_dict.keys())
    combo_results = {}
    
    # 从最大组合到最小组合遍历
    for size in range(len(keys), 0, -1):
        for combo in itertools.combinations(keys, size):
            # 计算当前组合的交集
            if size == 1:
                intersected = set_dict[combo[0]].copy()
            else:
                intersected = set.intersection(*(set_dict[key] for key in combo))
            
            # 计算唯一值:当前交集减去所有包含该组合的更大组合的交集
            unique_values = intersected.copy()
            extra_keys = [k for k in keys if k not in combo]
            # 遍历所有比当前组合大的尺寸
            for add_count in range(1, len(extra_keys)+1):
                for extra in itertools.combinations(extra_keys, add_count):
                    larger_combo = combo + extra
                    if larger_combo in combo_results:
                        unique_values -= combo_results[larger_combo]['intersected']
            
            # 保存结果
            combo_name = ','.join(combo)
            combo_results[combo] = {
                'name': combo_name,
                'unique': unique_values,
                'intersected': intersected
            }
    
    # 转换为要求的元组列表,可按组合大小排序
    sorted_results = sorted(combo_results.values(), key=lambda x: len(x['name'].split(',')))
    return [(res['name'], res['unique'], res['intersected']) for res in sorted_results]

代码说明

  • 组合生成:借助itertools.combinations自动生成所有可能的非空组合,不管集合字典里有多少个集合,都能适配。
  • 交集计算:单个集合的交集就是自身;多集合交集用set.intersection批量处理,无需手动写多层循环。
  • 唯一值计算:通过从当前组合的交集中剔除所有包含它的更大组合的交集,得到只属于当前组合交集的唯一值。
  • 结果整理:把处理好的结果转换成要求的元组格式,还可以按组合元素数量排序,方便查看。

测试示例

# 测试用集合字典
set_dict = {
    'A': {1,2,3,4},
    'B': {2,3,5,6},
    'C': {3,4,6,7}
}

# 执行处理
results = process_set_dict(set_dict)
for item in results:
    print(item)

输出结果:

('A', {1}, {1, 2, 3, 4})
('B', {5}, {2, 3, 5, 6})
('C', {7}, {3, 4, 6, 7})
('A,B', {2}, {2, 3})
('A,C', {4}, {3, 4})
('B,C', {6}, {3, 6})
('A,B,C', {3}, {3})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 11:42:14