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

如何在Python中从字典创建集合的集合

解决Python字典生成笛卡尔积集合列表的问题

我是Python编程新手,遇到了一个问题:我有一个如下所示的Python字典:

Rplus = {'i1': {'r1', 'r3', 'r7'},'i2': {'r10', 'r8'},'i3': {'r4', 'r5', 'r9'},'i4': {'r2', 'r6'}}

我想要从该字典生成一个集合的列表,要求每个子集合恰好包含字典每个键对应的一个元素,示例输出如下:

S = [{'r1', 'r10', 'r5','r2'}, {'r3', 'r8', 'r4', 'r6'}, {'r2', 'r5', 'r8', 'r1'},......., {'r10', 'r6', 'r4', 'r7'}]

我尝试了以下代码但未成功,请求帮助解决该问题。
我的尝试代码:

import copy

S = []
Sprime = []

# 注:原代码未定义items,需补充为items = Rplus.keys()
for i in Rplus.keys(): 
    if len(Rplus[i])==1:
        if len(S)==0:
            S.append(Rplus[i])
        else:
            for s in range(len(S)):
                # union返回新集合但未赋值,原集合不会改变
                S[s].union(Rplus[i])
    else:
        Sprime = copy.deepcopy(S)
        for r in Rplus[i]:
            if len(Sprime) == 0:
                Sprime.append({r})
            else:
                for j in range(len(Sprime)):
                    # update会修改原集合,导致后续数据混乱
                    Sprime[j].update([r])
                    if Sprime[j] not in S:
                        S.append(Sprime[j])             
print(S)

问题分析

你要实现的本质是字典各值集合的笛卡尔积——从每个键对应的集合里选一个元素,组合出所有可能的子集合。你的代码存在几个核心问题:union方法返回新集合但未赋值,update会直接修改原集合导致数据混乱,还有未定义items变量等。

简洁解决方案(用标准库)

Python标准库的itertools.product可以直接生成笛卡尔积,再把每个元组转成集合即可,代码简洁高效:

import itertools

Rplus = {'i1': {'r1', 'r3', 'r7'},'i2': {'r10', 'r8'},'i3': {'r4', 'r5', 'r9'},'i4': {'r2', 'r6'}}

# 提取字典所有值的集合(Python 3.7+字典默认有序)
value_sets = list(Rplus.values())
# 生成笛卡尔积,将每个元组转换为集合后组成列表
S = [set(combination) for combination in itertools.product(*value_sets)]

print(S)

代码说明

  1. itertools.product(*value_sets):*运算符把value_sets拆分为多个参数,生成所有可能的元素组合(每个组合是一个元组,包含每个集合中的一个元素)。
  2. set(combination):将每个笛卡尔积元组转换为集合,匹配你需要的输出格式。
  3. 若使用Python 3.7以下版本(字典无序),可手动指定键的顺序来保证组合顺序,比如:
    value_sets = [Rplus['i1'], Rplus['i2'], Rplus['i3'], Rplus['i4']]
    

手动实现思路(不用标准库)

如果想自己实现核心逻辑,可通过逐步构建结果集的方式完成:

Rplus = {'i1': {'r1', 'r3', 'r7'},'i2': {'r10', 'r8'},'i3': {'r4', 'r5', 'r9'},'i4': {'r2', 'r6'}}

result = [set()]  # 初始空集合
for current_set in Rplus.values():
    temp = []
    for existing in result:
        for elem in current_set:
            # 复制现有集合并添加新元素,避免修改原集合
            new_set = existing.copy()
            new_set.add(elem)
            temp.append(new_set)
    result = temp

print(result)

这段代码的逻辑是:每次处理一个值集合,将现有结果中的每个集合与当前集合的元素逐一组合,生成新的集合,逐步构建出所有可能的组合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:35:13