Python实现数值列表分数排名的代码编写思路咨询
Python 分数排名实现思路提示
核心计算规则
- 前置环节:给定的原始数值列表
x = [4,4,10,4,10,2,4,1,1,2]已通过插入排序完成升序排列,得到排序后列表x = [1, 1, 2, 2, 4, 4, 4, 4, 10, 10] - 参照序列:生成与排序后列表等长的连续自然数位置序列
n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],作为排名计算的位置基准 - 排名计算逻辑:所有数值相同的元素,取其在位置序列中覆盖的全部位置的算术平均值,作为该数值对应的统一排名:
- 数值1覆盖位置1、2,对应排名(1+2)/2 = 1.5
- 数值2覆盖位置3、4,对应排名(3+4)/2 = 3.5
- 数值4覆盖位置5、6、7、8,对应排名(5+6+7+8)/4 = 6.5
- 数值10覆盖位置9、10,对应排名(9+10)/2 = 9.5
- 输出要求:生成与输入列表一一对应的排名列表,示例最终结果为
r = [1.5, 1.5, 3.5, 3.5, 6.5, 6.5, 6.5, 6.5, 9.5, 9.5]
现有参考代码问题梳理
# 假设输入列表已完成排序 def ranking(x): l = len(x) for ele in range(1, l): t = x[ele-1] m = x.count(t) i = 0 sum = 0 while i < m: # 原本的意图是至少正确计算出列表首个元素的排名 sum = sum + 1 i = i + 1 x[ele] = sum/t return x
- 计算逻辑偏离规则:代码中错误将元素值作为排名计算的分母,既没有累加对应位置的序列数值,也没有按位置平均的公式计算,完全不符合排名定义
- 冗余逻辑:循环内反复调用
x.count(t)统计元素重复次数,会对同一个值多次遍历全表,效率低下且容易出现位置匹配偏差 - 原列表污染:直接在传入的排序列表上赋值修改,没有单独存储排名结果,会破坏原本的排序输入数据
实现思路提示
- 利用排序列表的天然特性:排序后所有相同数值的元素必然连续排布,不需要对全表做重复值扫描,可直接通过相邻元素比较识别分组边界;注意Python列表索引为0起始,计算位置时需要统一偏移为1起始的计数规则
- 逐组记录关键参数:每识别出一个相同值的分组,记录两个核心信息——分组在1起始计数下的起始位置、分组包含的元素总个数
- 按公式计算单组排名:对每个分组,累加覆盖的所有位置数值,除以分组元素个数,得到该值对应的统一平均排名
- 填充结果列表:将计算得到的统一排名,按分组的元素个数完整填充到结果列表的对应位置,即可得到排序后列表对应的排名序列
内容的提问来源于stack exchange,提问作者Victor Paes Plinio
相关产品推荐
相关产品推荐

