此方法由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数据结构中只能够存放一元结构,例如元组,对于列表等结构无法存放。
要注意集合元素种类的选择。