在 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)}.
通常,我们可以使用嵌套循环来生成笛卡尔积。例如,以下代码生成两个集合 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,