Elixir:计算映射列表中秒数的总平均值(支持nil处理)
问题:计算医院各环节患者平均耗时及总平均等待时长
样本数据
[%{ check_in_time: 60, imaging_time: 180, lab_time: 120, vital_time: 60, pharmacy_time: 100 },%{ check_in_time: 20, imaging_time: 380, lab_time: 10, vital_time: 60, pharmacy_time: 200 }]
每个映射代表一位患者在医院各环节的耗时(单位:秒)。核心需求:
- 计算每个环节的患者平均耗时(忽略
nil值) - 基于各环节的平均值,计算总平均等待时长
原错误实现
def calculate(items) do items |> Enum.reduce( %{ check_in_time: 0, imaging_time: 0, lab_time: 0, pharmacy_time: 0, vital_time: 0 }, fn %{ check_in_time: check_in_time, imaging_time: imaging_time, lab_time: lab_time, pharmacy_time: pharmacy_time, vital_time: vital_time }, acc -> %{ check_in_time: acc.check_in_time + check_in_time, imaging_time: acc.imaging_time + imaging_time, lab_time: acc.lab_time + lab_time, pharmacy_time: acc.pharmacy_time + pharmacy_time, vital_time: acc.vital_time + vital_time } end ) |> sum_average() end defp sum_average(%{ check_in_time: check_in_time, imaging_time: imaging_time, lab_time: lab_time, pharmacy_time: pharmacy_time, vital_time: vital_time }) do (check_in_time + imaging_time + lab_time + pharmacy_time + vital_time) / 5 end
错误点:
- 直接将所有环节的总耗时相加后除以环节数,未按需求先计算每个环节的患者平均耗时
- 未处理字段值为
nil的场景,遇到nil会触发加法运算错误
正确实现(支持nil值)
def calculate_average_wait_time(patients) do # 定义需要统计的环节字段 fields = [:check_in_time, :imaging_time, :lab_time, :vital_time, :pharmacy_time] # 收集每个环节的非nil数值列表 field_value_lists = Enum.reduce(fields, %{}, fn field, acc -> valid_values = Enum.filter(patients, & &1[field] != nil) |> Enum.map(& &1[field]) Map.put(acc, field, valid_values) end) # 计算每个环节的平均值(空列表返回0,可根据需求调整为nil) field_averages = Enum.map(field_value_lists, fn {_field, values} -> if Enum.empty?(values) do 0 else Enum.sum(values) / length(values) end end) # 计算总平均(跳过无有效数据的环节) valid_averages = Enum.filter(field_averages, & &1 != 0) if Enum.empty?(valid_averages) do 0 else Enum.sum(valid_averages) / length(valid_averages) end end # 测试调用 patients = [ %{check_in_time: 60, imaging_time: 180, lab_time: 120, vital_time: 60, pharmacy_time: 100}, %{check_in_time: 20, imaging_time: 380, lab_time: 10, vital_time: 60, pharmacy_time: 200} ] IO.puts calculate_average_wait_time(patients) # 输出:119.0
实现说明
- 字段列表定义:通过可配置的字段列表替代硬编码,提升代码扩展性
- 非nil值收集:针对每个环节,过滤掉
nil值,只保留有效耗时数据参与计算 - 环节平均值计算:对每个环节的有效数据计算平均值,空列表场景可按需调整返回值(如
nil) - 总平均计算:基于各环节的有效平均值计算总平均,避免无数据环节干扰结果
内容的提问来源于stack exchange,提问作者Junaid Farooq
相关产品推荐
相关产品推荐

