Python计算相同数组笛卡尔积后如何去除无序等价重复组合
解决方案
你需要的本质是从单个数组中取长度为2的不重复无序组合,可以按你的实际场景选以下两种方案:
方案1:直接生成目标结果(最优,无需先算笛卡尔积)
因为你的A、B数组完全相同,直接用itertools.combinations生成无序组合即可,效率远高于生成笛卡尔积后再去重:
import numpy as np from itertools import combinations A = np.array(['A','B','C']) result = list(combinations(A, 2))
输出结果和你需要的完全一致:
[('A', 'B'), ('A', 'C'), ('B', 'C')]
方案2:对已生成的笛卡尔积结果去重
如果你已经提前生成了笛卡尔积结果b,可以通过排序后判重的方式过滤:
保留原始顺序版本
seen = set() result = [] for item in b: # 跳过两个元素相同的项 if item[0] == item[1]: continue # 对元组排序后判重,保证逆序对只会被保留一次 sorted_item = tuple(sorted(item)) if sorted_item not in seen: seen.add(sorted_item) result.append(item)
简洁版本(不保留原始顺序)
result = list({tuple(sorted(i)) for i in b if i[0] != i[1]})
纯Numpy实现方案
如果不想依赖itertools,可以用numpy上三角索引直接过滤:
import numpy as np A = np.array(['A','B','C']) # 生成笛卡尔积数组 cartesian = np.array(np.meshgrid(A, A)).T.reshape(-1, 2) # 取上三角(k=1表示跳过对角线的相同元素对) result = cartesian[np.triu_indices(len(A), k=1)].tolist()
内容的提问来源于stack exchange,提问作者taylor
相关产品推荐
相关产品推荐

