如何按子列表第二项合并嵌套列表,对最后两项求和并移除首元素
直接使用 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
相关产品推荐
相关产品推荐

