Python——求笛卡尔乘积的方法

时间:2024-02-24 19:39:47

 

1. 笛卡尓乘积

在数学中,两个集合X和Y的笛卡尓乘积(Cartesian product),又称直积,表示为 X × Y ,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0), (a,1), (a,2), (b,0), (b,1), (b, 2)}。有时我们需要在python求两个list的笛卡尔乘积,其实很简单,一行代码搞定。

2. 示例

例如,求a={1,2,3}与b={0,1,2}的笛卡尔乘积,与a={1,2,3}自身的笛卡尔乘积,python代码如下:

#-*-coding:utf-8-*-
import itertools;
a=[1,2,3];
b=[4,5,6];
print("a,b的笛卡尔乘积:",end="")
for x in itertools.product(a,b):
  print(x,end="")
print()
print("a自身的笛卡尔乘积:",end="")
for x in itertools.product(a,a):
  print(x,end="")
print()

运行结果如下:

a,b的笛卡尔乘积:(1, 4)(1, 5)(1, 6)(2, 4)(2, 5)(2, 6)(3, 4)(3, 5)(3, 6)
a自身的笛卡尔乘积:(1, 1)(1, 2)(1, 3)(2, 1)(2, 2)(2, 3)(3, 1)(3, 2)(3, 3)

 

3. itertools模块

值得注意的是,上述代码中的itertools是一个python的标准库,可以直接引入使用。

itertools模块下有如下几个函数可供使用:

function description
itertools.product 笛卡尔积
itertools.permutations 排列
itertools.combinations 组合,没有重复
itertools.combinations_with_replacement 组合,有重复

代码示例:

>>> import itertools
>>> for i in itertools.product(\'ABCD\', repeat = 2):
...     print i,
... 
(\'A\', \'A\') (\'A\', \'B\') (\'A\', \'C\') (\'A\', \'D\') (\'B\', \'A\') (\'B\', \'B\') (\'B\', \'C\') (\'B\', \'D\') (\'C\', \'A\') (\'C\', \'B\') (\'C\', \'C\') (\'C\', \'D\') (\'D\', \'A\') (\'D\', \'B\') (\'D\', \'C\') (\'D\', \'D\')
>>> for i in itertools.permutations(\'ABCD\', 2):
...     print i,
... 
(\'A\', \'B\') (\'A\', \'C\') (\'A\', \'D\') (\'B\', \'A\') (\'B\', \'C\') (\'B\', \'D\') (\'C\', \'A\') (\'C\', \'B\') (\'C\', \'D\') (\'D\', \'A\') (\'D\', \'B\') (\'D\', \'C\')
>>> for i in itertools.combinations(\'ABCD\', 2):
...     print i,
... 
(\'A\', \'B\') (\'A\', \'C\') (\'A\', \'D\') (\'B\', \'C\') (\'B\', \'D\') (\'C\', \'D\')
>>> for i in itertools.combinations_with_replacement(\'ABCD\', 2):
...     print i,
... 
(\'A\', \'A\') (\'A\', \'B\') (\'A\', \'C\') (\'A\', \'D\') (\'B\', \'B\') (\'B\', \'C\') (\'B\', \'D\') (\'C\', \'C\') (\'C\', \'D\') (\'D\', \'D\')

 

参考资料:

[1]. Python官方文档:https://docs.python.org/3.6/library/itertools.html

[2].yongh701的CSDN:https://blog.csdn.net/yongh701/article/details/52605536

[3]. kitt blog:http://chaoren.is-programmer.com/posts/42538.html?utm_source=tuicool&utm_medium=referral