You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判定基于含重复分数排序的不同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等效需要满足两个条件:

  1. 两个列表的分数序列完全一致:即对应位置的元素在原scores中的值完全相同;
  2. 所有相同分数的元素集合完全一致:即每个分数对应的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

逻辑说明

  1. 长度检查:如果两个sorted_ids长度不同,显然不可能等效;
  2. 分数序列验证:确保两个列表的整体排序优先级完全一致——高分元素在前,低分在后,对应位置的分数层级没有偏差;
  3. 分组集合验证:确保相同分数的元素没有被错误替换或遗漏,只允许相同分数组内的顺序差异。

内容的提问来源于stack exchange,提问作者eljiwo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:11:05