如何使用Elixir内置函数仅展平嵌套列表的一层?
如何在Elixir中仅展平嵌套列表的一层?
假设你有一个深度为3的嵌套列表:
[ [[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]] ]
使用List.flatten/1会直接完全展平所有层级,得到:
[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]
但如果只想展平最外层的一层,得到如下结果:
[ [1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6] ]
可以用Elixir内置的Enum.flat_map/2函数实现,只需要把每个外层元素直接返回即可,因为flat_map会自动将每个元素(这里是内层的子列表)合并到结果列表中:
nested_list = [ [[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]] ] Enum.flat_map(nested_list, & &1) # 输出:[[1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6]]
原理很简单:Enum.flat_map/2会遍历列表中的每个元素,对每个元素执行传入的函数(这里的& &1就是直接返回元素本身),然后将所有返回的列表拼接在一起——正好实现了仅展平最外层一层的效果,同时完全保留内部元素的顺序。
另外也可以用List.foldl/3手动拼接,不过Enum.flat_map/2是最简洁的内置方案:
List.foldl(nested_list, [], fn sublist, acc -> acc ++ sublist end)
内容的提问来源于stack exchange,提问作者ahmed-el-awad
相关产品推荐
相关产品推荐

