Elixir 语言 列表分组与聚合函数用法

Elixir阿木 发布于 2025-06-19 7 次阅读


摘要:

Elixir 是一种用于构建可扩展和可靠应用程序的函数式编程语言,它运行在 Erlang 虚拟机上。在处理数据时,列表分组与聚合函数是常见的需求。本文将深入探讨 Elixir 语言中列表分组与聚合函数的用法,包括内置函数、自定义函数以及一些高级技巧。

一、

在 Elixir 中,列表是处理数据的基本结构之一。列表分组与聚合函数是数据处理中不可或缺的工具,可以帮助我们快速地对数据进行分类和汇总。本文将详细介绍 Elixir 中列表分组与聚合函数的用法,包括内置函数和自定义函数。

二、Elixir 列表分组

列表分组是将列表中的元素按照一定的规则进行分类的过程。在 Elixir 中,我们可以使用内置函数 `Enum.group_by/3` 来实现列表分组。

1. `Enum.group_by/3` 函数

`Enum.group_by/3` 函数接受三个参数:列表、键函数和值函数。键函数用于提取每个元素的分组键,值函数用于提取每个元素的值。

elixir

list = [1, 2, 2, 3, 4, 4, 4, 5]


grouped_list = Enum.group_by(list, fn x -> x end, fn x -> x end)


IO.inspect(grouped_list)


输出: [{1, [1]}, {2, [2, 2]}, {3, [3]}, {4, [4, 4, 4]}, {5, [5]}]


在上面的例子中,我们使用 `fn x -> x end` 作为键函数和值函数,这意味着每个元素都是它自己的分组键和值。

2. 使用自定义键函数

在实际应用中,我们可能需要根据元素的某些属性进行分组。这时,我们可以定义一个自定义的键函数。

elixir

list = [{name: "Alice", age: 25}, {name: "Bob", age: 30}, {name: "Alice", age: 22}]


grouped_list = Enum.group_by(list, fn x -> x.name end, fn x -> x.age end)


IO.inspect(grouped_list)


输出: [{"Alice", [25, 22]}, {"Bob", [30]}]


在上面的例子中,我们根据 `name` 属性进行分组,并提取每个元素的 `age` 属性。

三、Elixir 列表聚合

列表聚合是对列表中的元素进行汇总的过程。在 Elixir 中,我们可以使用内置函数 `Enum.reduce/3` 或 `Enum.sum/1` 来实现列表聚合。

1. `Enum.reduce/3` 函数

`Enum.reduce/3` 函数接受三个参数:初始值、列表和累加函数。累加函数用于将列表中的元素累加到初始值上。

elixir

list = [1, 2, 3, 4, 5]


sum = Enum.reduce(list, 0, fn x, acc -> x + acc end)


IO.inspect(sum)


输出: 15


在上面的例子中,我们将列表中的元素累加到初始值 `0` 上。

2. `Enum.sum/1` 函数

`Enum.sum/1` 函数是 `Enum.reduce/3` 的一个简化版本,专门用于计算列表中所有元素的累加和。

elixir

list = [1, 2, 3, 4, 5]


sum = Enum.sum(list)


IO.inspect(sum)


输出: 15


在上面的例子中,我们直接使用 `Enum.sum/1` 函数计算列表的累加和。

四、高级技巧

1. 使用 `Enum.map/2` 和 `Enum.filter/2` 进行数据预处理

在处理列表分组和聚合之前,我们可能需要对数据进行预处理。`Enum.map/2` 和 `Enum.filter/2` 函数可以帮助我们实现这一目的。

elixir

list = [1, 2, 3, 4, 5, nil]


filtered_list = Enum.filter(list, fn x -> x != nil end)


mapped_list = Enum.map(filtered_list, fn x -> x 2 end)


grouped_list = Enum.group_by(mapped_list, fn x -> x end)


IO.inspect(grouped_list)


输出: [{2, [2]}, {4, [4]}, {6, [6]}, {8, [8]}]


在上面的例子中,我们首先使用 `Enum.filter/2` 过滤掉列表中的 `nil` 值,然后使用 `Enum.map/2` 将每个元素乘以 2,最后使用 `Enum.group_by/3` 进行分组。

2. 使用 `Enum.sort/2` 进行排序

在分组和聚合之前,我们可能需要对列表进行排序。

elixir

list = [5, 3, 1, 4, 2]


sorted_list = Enum.sort(list)


grouped_list = Enum.group_by(sorted_list, fn x -> x end)


IO.inspect(grouped_list)


输出: [{1, [1]}, {2, [2]}, {3, [3]}, {4, [4]}, {5, [5]}]


在上面的例子中,我们首先使用 `Enum.sort/2` 对列表进行排序,然后使用 `Enum.group_by/3` 进行分组。

五、总结

本文深入探讨了 Elixir 语言中列表分组与聚合函数的用法。通过内置函数 `Enum.group_by/3` 和 `Enum.reduce/3`,我们可以轻松地对数据进行分组和聚合。我们还介绍了一些高级技巧,如数据预处理和排序,以帮助读者更好地处理复杂的数据问题。

在 Elixir 的数据处理中,列表分组与聚合函数是强大的工具。掌握这些技巧,将有助于我们在实际项目中更高效地处理数据。