笛卡尔乘积是指在数学中,两个集合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)}。
类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。A表示所有声母的集合,B表示所有韵母的集合,那么A和B的笛卡尔积就为所有可能的汉字全拼。
设A,B为集合,用A中元素为第一元素,B中元素为第二元素构成有序对,所有这样的有序对组成的集合叫做A与B的笛卡尔积,记作AxB.
笛卡尔积的符号化为:
A×B={(x,y)|x∈A∧y∈B}
例如,A={a,b}, B={0,1,2},则
A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}
B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}
计算多个集合的笛卡尔积,有规律可循,算法和代码也不难,但是很多语言都没有提供直接计算笛卡尔积的方法,需要自己写大段大段的代码计算笛卡尔积,python 提供了一种最简单的计算笛卡称积的方法(只需要一行代码),详见下面的代码:
#!/usr/bin/python3 # -*- coding: utf-8 -*- # @version: 1.0 # @desc : 用python实现求笛卡尔积 import itertools class cartesian(object): def __init__(self): self._data_list=[] def add_data(self,data=[]): #添加生成笛卡尔积的数据列表 self._data_list.append(data) def build(self): #计算笛卡尔积 for item in itertools.product(*self._data_list): print(item) if __name__=="__main__": car=cartesian() car.add_data([1,2,3,4]) car.add_data([5,6,7,8]) car.add_data([9,10,11,12]) car.build()
计算的结果如下:
(1, 5, 9) (1, 5, 10) (1, 5, 11) (1, 5, 12) (1, 6, 9) (1, 6, 10) (1, 6, 11) (1, 6, 12) (1, 7, 9) (1, 7, 10) (1, 7, 11) (1, 7, 12) (1, 8, 9) (1, 8, 10) (1, 8, 11) (1, 8, 12) (2, 5, 9) (2, 5, 10) (2, 5, 11) (2, 5, 12) (2, 6, 9) (2, 6, 10) (2, 6, 11) (2, 6, 12) (2, 7, 9) (2, 7, 10) (2, 7, 11) (2, 7, 12) (2, 8, 9) (2, 8, 10) (2, 8, 11) (2, 8, 12) (3, 5, 9) (3, 5, 10) (3, 5, 11) (3, 5, 12) (3, 6, 9) (3, 6, 10) (3, 6, 11) (3, 6, 12) (3, 7, 9) (3, 7, 10) (3, 7, 11) (3, 7, 12) (3, 8, 9) (3, 8, 10) (3, 8, 11) (3, 8, 12) (4, 5, 9) (4, 5, 10) (4, 5, 11) (4, 5, 12) (4, 6, 9) (4, 6, 10) (4, 6, 11) (4, 6, 12) (4, 7, 9) (4, 7, 10) (4, 7, 11) (4, 7, 12) (4, 8, 9) (4, 8, 10) (4, 8, 11) (4, 8, 12)