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

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
}]

每个映射代表一位患者在医院各环节的耗时(单位:秒)。核心需求:

  1. 计算每个环节的患者平均耗时(忽略nil值)
  2. 基于各环节的平均值,计算总平均等待时长

原错误实现

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

实现说明

  1. 字段列表定义:通过可配置的字段列表替代硬编码,提升代码扩展性
  2. 非nil值收集:针对每个环节,过滤掉nil值,只保留有效耗时数据参与计算
  3. 环节平均值计算:对每个环节的有效数据计算平均值,空列表场景可按需调整返回值(如nil)
  4. 总平均计算:基于各环节的有效平均值计算总平均,避免无数据环节干扰结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:53:27