python遍历法、迭代法求多个集合的笛卡尔积
关于求笛卡尔积,我个人想到了两种方法:遍历法:
```
def cartesian_product(*args, merge=False):#*args包括两个及两个以上集合,merge参数为Tue则结果的序偶合并为多元有序组
for n in range(len(args)-1):
Product=set()
S1, S2=args[:2] #对于多次求笛卡尔积,每一次取前两个集合参与运算
if merge==True:
for i in S1:
x=(i,) if type(i)!=tuple else i
for j in S2:
y=(j,) if type(j)!=tuple else j
Product.add(x+y)
else:
for i in S1:
for j in S2:
Product.add((i, j))
args=(Product,)+args #每次运算结束,后边的不动,将前两个集合参数替换为结果,继续参与下一次运算
return Product
```
迭代法:
```
def cartesian_product(*args, merge=False):
Product=set()
S1, S2=args[:2]
if merge==True:
for i in S1:
x=(i,) if type(i)!=tuple else i
for j in S2:
y=(j,) if type(j)!=tuple else j
Product.add(x+y)
else:
for i in S1:
for j in S2:
Product.add((i, j))
args=(Product,)+args
if len(args)==1: #只剩一个参数时即为结果
return Product
else:
return cartesian_product(*args, merge=merge)
```
调试(两种方法的都一样):
```
>>> s1={1, 2, 3}
>>> s2={True, False}
>>> s3={"a", "b", "c", "d"}
>>> cartesian_product(s1, s2, s3, merge=False)
{((2, False), 'd'), ((1, False), 'a'), ((3, False), 'd'), ((1, False), 'b'), ((2, True), 'a'), ((2, False), 'c'), ((1, True), 'c'), ((2, True), 'b'), ((1, True), 'd'), ((1, True), 'b'), ((1, True), 'a'), ((1, False), 'c'), ((3, True), 'c'), ((3, False), 'a'), ((2, True), 'c'), ((2, True), 'd'), ((2, False), 'b'), ((3, False), 'b'), ((2, False), 'a'), ((1, False), 'd'), ((3, False), 'c'), ((3, True), 'b'), ((3, True), 'd'), ((3, True), 'a')}
>>> cartesian_product(s1, s2, s3, merge=True)
{(1, True, 'd'), (1, False, 'd'), (3, True, 'a'), (3, False, 'b'), (3, True, 'd'), (1, False, 'a'), (1, False, 'b'), (3, False, 'd'), (3, True, 'b'), (2, False, 'a'), (3, False, 'a'), (2, False, 'd'), (2, True, 'd'), (2, False, 'b'), (2, True, 'c'), (1, True, 'a'), (2, False, 'c'), (1, True, 'b'), (1, False, 'c'), (3, True, 'c'), (3, False, 'c'), (1, True, 'c'), (2, True, 'a'), (2, True, 'b')}
>>>
``` 看不懂,但是后面总会学到 感谢分享 没求过…… 现在在学习python,看下楼主代码参考一下 这个厉害呀。 要多学习 我只会普通遍历 笛卡尔积不明觉厉 学习学习 谢谢大佬分享
页:
[1]
2