python实现集合笛卡尔乘积的两种方法

递归法

此方法由weixin_46062838提供

def DescartesProduct(*args):
#只有两个集合时,直接求解
    if(len(args) == 2):
        a = set()
        for x in args[0]:
            for y in args[1]:
                if type(x) == tuple:
                    b = list(x)
                    b.append(y)
                    b = tuple(b)
                    a.add(b)
                else:
                    a.add((x,y))
        return a
#当集合数大于2时,采用递归,将args中的第一个集合与第二个集合做笛卡尔乘积,
#将得到的结果作为新的一个集合与第三个集合做笛卡尔乘积,以此类推,直到最后只剩两个集合。
    else:
        ori = args[0]
        for x in args[1:]:
            args1 = x
            set1 = DescartesProduct(ori,args1)
            ori = set1
    return ori
#验证
print(DescartesProduct({1,2,7},{3,4},{5,6}))
#结果
{(2, 3, 5), (2, 3, 6), (1, 3, 6), (7, 3, 5), (2, 4, 6), (7, 4, 5), (1, 4, 5), (1, 3, 5), (7, 4, 6), (2, 4, 5), (1, 4, 6), (7, 3, 6)}

循环法

此方法本人原创

def DescartesProduct(*args):
    #设立集合a,b用来承载中间数据
    a=set()
    b=set()
    #将a,b中加入空元组作为初始项
    a.add(())
    b.add(())
    #遍历args中的集合,每对一个i(集合)完成操作,就清空a,并将上一次乘积运算所得到的结果(储存在b中)赋值给a,
    #由新的得到的a与i的下一个集合做笛卡尔乘积运算,存在b中,储展开下一轮循环
    for i in args:
        a.clear()
        a = b.copy()
        b.clear()
        for j in i:
            for k in a:
                e = []
                for q in k:
                    e.append(q)
                e.append(j)
                b.add(tuple(e))
 	#最后的b承载了args每一项乘积完的结果
    return b

#验证
print(DescartesProduct({1,2,7},{3,4},{5,6}))
#结果
{(2, 3, 5), (2, 3, 6), (1, 3, 6), (7, 3, 5), (2, 4, 6), (7, 4, 5), (1, 4, 5), (1, 3, 5), (7, 4, 6), (2, 4, 5), (1, 4, 6), (7, 3, 6)}
        

注意的地方

set数据结构中只能够存放一元结构,例如元组,对于列表等结构无法存放。
要注意集合元素种类的选择。

猜你喜欢

转载自blog.csdn.net/zk280big100/article/details/108435689