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

如何按子列表第二项合并嵌套列表,对最后两项求和并移除首元素

直接使用 Enum.group_by/2 搭配 Enum.reduce/3 即可实现,不需要提前拆分所有子列表,逻辑更直观:

实现代码

# 原始输入数据
origin_list = [
  ["nginx-66b6c48dd5-25wv5", "nginx-deployment", "worker-1", "0", "2"],
  ["nginx-66b6c48dd5-2nhbs", "nginx-deployment", "worker-1", "0", "2"],
  ["nginx-66b6c48dd5-5b4dw", "nginx-deployment", "worker-1", "0", "2"],
  ["nginx-66b6c48dd5-p7sx9", "nginx-deployment", "worker-1", "0", "2"],          
  ["coredns-autoscaler-76f8869cc9-gd69j", "kube-system", "worker-1", "1", "5"],
  ["coredns-55b58f978-q2skn", "kube-system", "worker-1", "7", "11"] 
]

# 处理逻辑
result = 
  origin_list
  # 按子列表第二个元素分组
  |> Enum.group_by(&Enum.at(&1, 1))
  |> Enum.map(fn {group_key, items} ->
    # 取同分组的节点标识(所有子列表第三个元素默认同组一致,如需支持多节点可把节点加入分组key)
    node = items |> hd() |> Enum.at(2)
    # 累加同分组最后两个数值
    {sum_col3, sum_col4} = 
      Enum.reduce(items, {0, 0}, fn item, {acc3, acc4} ->
        col3 = item |> Enum.at(3) |> String.to_integer()
        col4 = item |> Enum.at(4) |> String.to_integer()
        {acc3 + col3, acc4 + col4}
      end)
    # 组装成目标格式
    [group_key, node, to_string(sum_col3), to_string(sum_col4)]
  end)

输出结果

运行上述代码后得到的result完全符合预期:

[
  ["nginx-deployment", "worker-1", "0", "8"],
  ["kube-system", "worker-1", "8", "16"]
]

扩展说明

如果实际场景中同分组(第二个元素相同)的子列表可能出现第三个元素(节点名)不一致的情况,可以调整分组逻辑为联合分组,把Enum.group_by的参数改为:

Enum.group_by(&{Enum.at(&1, 1), Enum.at(&1, 2)})

后续map阶段拆分分组key即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:39:03