如何判定基于含重复分数排序的不同ids列表为等效?
基于scores判定不同sorted_ids排序结果的等效性
给定两组列表:
ids = [1,2,3,5,6,7] scores = [5., 5. , 4., 3., 2., 1.]
当对scores执行argsort来索引ids时,由于存在相同分数的元素,排序结果的顺序无法保证。比如scores.argsort()可能返回[5, 4, 3, 2, 1, 0]或[5, 4, 3, 2, 0, 1],对应的sorted_ids会是:
sorted_ids = [7,6,5,3,2,1] # 或者 sorted_ids = [7,6,5,3,1,2]
这两种sorted_ids本质是等效的,因为它们的排序逻辑完全遵循scores的优先级——相同分数的元素顺序不影响排序的有效性。以下是具体的判定方法:
核心判定逻辑
两个sorted_ids等效需要满足两个条件:
- 两个列表的分数序列完全一致:即对应位置的元素在原
scores中的值完全相同; - 所有相同分数的元素集合完全一致:即每个分数对应的id集合在两个列表中没有差异(顺序无关)。
实现代码
用Python可以这样实现判定函数:
def are_sorted_ids_equivalent(sorted_ids1, sorted_ids2, id_score_map): # 长度不一致直接返回不等效 if len(sorted_ids1) != len(sorted_ids2): return False # 检查对应位置的分数是否完全匹配 for id1, id2 in zip(sorted_ids1, sorted_ids2): if id_score_map[id1] != id_score_map[id2]: return False # 按分数分组,验证相同分数的id集合是否一致 score_groups1 = {} for idx in sorted_ids1: score = id_score_map[idx] score_groups1.setdefault(score, set()).add(idx) score_groups2 = {} for idx in sorted_ids2: score = id_score_map[idx] score_groups2.setdefault(score, set()).add(idx) return score_groups1 == score_groups2 # 测试示例 ids = [1,2,3,5,6,7] scores = [5., 5. , 4., 3., 2., 1.] id_to_score = dict(zip(ids, scores)) sorted_ids_a = [7,6,5,3,2,1] sorted_ids_b = [7,6,5,3,1,2] print(are_sorted_ids_equivalent(sorted_ids_a, sorted_ids_b, id_to_score)) # 输出 True
逻辑说明
- 长度检查:如果两个
sorted_ids长度不同,显然不可能等效; - 分数序列验证:确保两个列表的整体排序优先级完全一致——高分元素在前,低分在后,对应位置的分数层级没有偏差;
- 分组集合验证:确保相同分数的元素没有被错误替换或遗漏,只允许相同分数组内的顺序差异。
内容的提问来源于stack exchange,提问作者eljiwo
相关产品推荐
相关产品推荐

