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