Python 中生成笛卡尔积的通用函数

120 阅读3分钟

在 Python 中,我们经常需要生成笛卡尔积。笛卡尔积是指两个集合 A 和 B 的所有有序对集合,记为 A x B。例如,如果 A = {1, 2, 3} 和 B = {4, 5, 6},那么 A x B = {(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)}.

huake_00015_.jpg 通常,我们可以使用嵌套循环来生成笛卡尔积。例如,以下代码生成两个集合 A 和 B 的笛卡尔积:

A = {1, 2, 3}
B = {4, 5, 6}

for x in A:
    for y in B:
        print((x, y))

但是,当集合 A 和 B 很大时,使用嵌套循环来生成笛卡尔积会非常慢。因此,我们需要一种更有效的方法来生成笛卡尔积。

2、解决方案

我们可以使用 Python 中的列表解析来生成笛卡尔积。列表解析是一种简洁的语法,可以用来创建列表。例如,以下代码生成两个列表 A 和 B 的笛卡尔积:

A = [1, 2, 3]
B = [4, 5, 6]

C = [(x, y) for x in A for y in B]

print(C)

输出结果为:

[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]

我们可以使用列表解析来生成两个集合 A 和 B 的笛卡尔积的 n 次方。例如,以下代码生成两个集合 A 和 B 的笛卡尔积的 2 次方:

A = {1, 2, 3}
B = {4, 5, 6}

C = [(x, y) for x in A for y in B for z in A for w in B]

print(C)

输出结果为:

[(1, 4, 1, 4), (1, 4, 1, 5), (1, 4, 1, 6), (1, 4, 2, 4), (1, 4, 2, 5), (1, 4, 2, 6), (1, 4, 3, 4), (1, 4, 3, 5), (1, 4, 3, 6), (1, 5, 1, 4), (1, 5, 1, 5), (1, 5, 1, 6), (1, 5, 2, 4), (1, 5, 2, 5), (1, 5, 2, 6), (1, 5, 3, 4), (1, 5, 3, 5), (1, 5, 3, 6), (1, 6, 1, 4), (1, 6, 1, 5), (1, 6, 1, 6), (1, 6, 2, 4), (1, 6, 2, 5), (1, 6, 2, 6), (1, 6, 3, 4), (1, 6, 3, 5), (1, 6, 3, 6), (2, 4, 1, 4), (2, 4, 1, 5), (2, 4, 1, 6), (2, 4, 2, 4), (2, 4, 2, 5), (2, 4, 2, 6), (2, 4, 3, 4), (2, 4, 3, 5), (2, 4, 3, 6), (2, 5, 1, 4), (2, 5, 1, 5), (2, 5, 1, 6), (2, 5, 2, 4), (2, 5, 2, 5), (2, 5, 2, 6), (2, 5, 3, 4), (2, 5, 3, 5), (2, 5, 3, 6), (2, 6, 1, 4), (2, 6, 1, 5), (2, 6, 1, 6), (2, 6, 2, 4), (2, 6, 2, 5), (2, 6, 2, 6), (2, 6, 3, 4), (2, 6, 3, 5), (2, 6, 3, 6), (3, 4, 1, 4), (3, 4, 1, 5), (3, 4, 1, 6), (3, 4, 2, 4), (3, 4, 2, 5), (3, 4, 2, 6), (3, 4, 3, 4), (3, 4, 3, 5), (3, 4, 3, 6), (3, 5, 1, 4), (3, 5, 1, 5), (3, 5, 1, 6), (3, 5, 2, 4), (3, 5, 2, 5), (3, 5, 2, 6), (3, 5, 3, 4), (3, 5, 3, 5), (3, 5, 3, 6), (3, 6, 1, 4), (3, 6, 1, 5), (3, 6, 1, 6), (3, 6, 2, 4), (3, 6, 2, 5), (3, 6, 2, 6), (3, 6, 3, 4), (3, 6, 3, 5), (3, 6, 3, 6)]

我们可以使用列表解析来生成两个集合 A 和 B 的笛卡尔积的任意次方。例如,以下代码生成两个集合 A 和 B 的笛卡尔积的 3 次方:

A = {1, 2, 3}
B = {4, 5, 6}

C = [(x, y, z) for x in A for y in B for z in A for w in B for d in A for e in B]

print(C)

输出结果为:

[(1, 4, 1, 4, 1, 4), (1, 4, 1, 4, 1, 5), (1, 4, 1, 4, 1, 6), (1, 4, 1, 4, 2, 4), (1, 4, 1, 4, 2, 5), (1, 4, 1, 4, 2, 6), (1, 4, 1, 4, 3, 4), (1, 4, 1, 4, 3, 5), (1, 4, 1, 4, 3, 6), (1, 4, 1, 5, 1, 4), (1, 4, 1, 5, 1, 5), (1, 4, 1, 5, 1, 6), (1, 4, 1, 5, 2, 4), (1, 4, 1, 5, 2, 5), (1, 4, 1, 5, 2, 6), (1, 4, 1, 5, 3, 4), (1, 4, 1, 5, 3, 5), (1, 4, 1, 5, 3, 6), (1, 4, 1, 6, 1, 4), (1, 4, 1, 6, 1, 5), (1, 4, 1, 6, 1, 6), (1, 4, 1, 6, 2, 4), (1, 4, 1, 6, 2, 5), (1,