如何基于集合字典自动生成所有无重复组合的交集及唯一值?
动态处理集合字典的组合交集与唯一值计算
核心思路
- 用
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
相关产品推荐
相关产品推荐

