我知道如何使用
itertools.product
In [19]: from itertools import product
...:
...: abcd = product('abcd', 'abcd')
...: for i in range(4):
...: print(' '.join(repr(t) for _, t in zip(range(4), abcd)))
...:
('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')
In [20]:
进行 2D 笛卡尔积,但我只对上三角形感兴趣:
('a', 'b') ('a', 'c') ('a', 'd')
('b', 'c') ('b', 'd')
('c', 'd')
是否有一种有效的方法来生成仅生成上三角形的生成器?
def cart_tri(a):
"""为 a 中的项目生成 2D 笛卡尔积的上三角形。
Args:
a: 用于笛卡尔积的可迭代对象。
Yields:
a 的笛卡尔积的上三角形中的项目元组。
"""
for i in range(len(a)):
for j in range(i + 1, len(a)):
yield a[i], a[j]
for pair in cart_tri('abcd'):
print(pair)
说明:
-
该函数使用双循环迭代可迭代
a
中的项目的索引。 -
外循环遍历
i
从 0 到a
的长度减 1。 -
内循环遍历
j
从i + 1
到a
的长度减 1。这确保我们仅生成对,其中第一个元素的索引小于第二个元素的索引,从而生成上三角形。 -
对于每个
i
和j
对,该函数将项目在索引i
和j
处的元组(a[i], a[j])
生成。
此方法有效,因为它仅生成所需的元组,而无需生成和过滤整个笛卡尔积。
标签:python,cartesian-product From: 78776293