如何更高效地根据关联列表的对应元素对目标列表进行分组排序?
冗余代码的优化思路与实现
首先梳理原实现的核心冗余点:
- 把5组“高度值-列表索引”的对应关系分散写在多组
if判断中,每新增一个测试高度,就要同步修改初始化的空列表长度、新增对应判断分支,维护成本高 - 手动维护
counter游标同步遍历heightsTotal和timesTotal,忽略了两个列表是一一对应平行序列的前提,增加了无意义的游标管理逻辑 - 逐样本跑多组条件判断的运行效率偏低,样本量越大时判断开销越明显
方案1:兼容原有输出的简化实现
完全保持原有输出结构不变,抽离硬编码的映射关系,去掉手动计数器:
# 统一维护高度和嵌套列表索引的对应关系,仅需配置一次 height_index_map = {0.2: 0, 0.4: 1, 0.6: 2, 0.8: 3, 1: 4} # 用列表推导式初始化等长的空嵌套列表,比手动写5个[]更规整 timesAfterHeight = [[] for _ in range(len(height_index_map))] # 直接通过zip遍历两个平行列表,完全不需要手动计数 for h, t in zip(heightsTotal, timesTotal): timesAfterHeight[height_index_map[h]].append(t)
该方案和原代码的运行逻辑、输出结果完全一致,但代码量压缩近60%,没有冗余的分支判断,可维护性大幅提升。
方案2:高扩展性的通用实现
如果后续会新增更多测试高度,无需每次调整映射关系和初始化长度,用哈希分组逻辑自动归类即可:
from collections import defaultdict # 自动按下落高度做样本分组,无需提前预知所有高度值 height_group = defaultdict(list) for h, t in zip(heightsTotal, timesTotal): height_group[h].append(t) # 如需保持原有的固定顺序输出,仅需配置需要展示的高度顺序列表即可 target_height_order = [0.2, 0.4, 0.6, 0.8, 1.0] timesAfterHeight = [height_group[h] for h in target_height_order]
该方案的优势:
- 不需要提前硬编码初始化固定长度的嵌套列表
- 不需要写任何条件判断匹配样本对应的分组位置
- 新增测试高度时,仅需调整
target_height_order的配置,核心遍历逻辑零修改 - 运行效率优于原代码:字典/哈希结构的查找为O(1)复杂度,无逐分支判断的额外开销,大样本量下效率优势更显著
效率对比
原代码的时间复杂度为O(n*k),其中n为总测试样本数,k为固定的判断分支数(当前场景下k=5),样本越多、高度分支越多,重复判断的开销越大;
优化后方案的时间复杂度为O(n),每个样本仅需一次哈希查找,无冗余分支,运行效率更高。
内容的提问来源于stack exchange,提问作者Aurum-197
相关产品推荐
相关产品推荐

