如何在Python中枚举itertools.combinations的元组形式索引?
解决方案
你可以直接对原序列的下标执行combinations操作,再通过下标获取对应元素计算指标,即可直接生成键为下标元组(i,j)的字典,完全遵循combinations的原生规则,不需要自定义映射逻辑:
from itertools import combinations objects = [...] # 你的对象序列 metrics = { (i, j): metric(objects[i], objects[j]) for i, j in combinations(range(len(objects)), 2) }
验证示例
以官方示例的ABCD场景验证:
objects = ['A', 'B', 'C', 'D'] # 生成的下标对顺序为 (0,1) (0,2) (0,3) (1,2) (1,3) (2,3) # 对应元素对为 AB AC AD BC BD CD,和官方combinations规则完全一致
如果你已经提前生成了仅保存数值的metrics列表,需要将列表的整数索引反向映射为下标元组,也可以通过组合数公式直接计算:
import math def idx_to_pair(k, n): # k是metrics列表的整数索引,n是原objects序列的长度 i = n - 2 - math.floor(math.sqrt(-8*k + 4*n*(n-1)-7)/2.0 - 0.5) j = k + i + 1 - n*(n-1)//2 + (n-i)*((n-i)-1)//2 return (i, j) # 示例:n=4时,k=0返回(0,1),k=3返回(1,2),和规则匹配
优先推荐第一种方案,实现更简单也不会出现计算误差。
内容的提问来源于stack exchange,提问作者Alexander Soare
相关产品推荐
相关产品推荐

