展平列表的一个深度

问题描述 投票:0回答:2

我有一个列表嵌套在另一个列表中,深度为 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 定义的函数来做到这一点,我查阅了 Elixir 文档,但无法找到一种方法来做到这一点而不展平整个列表。

list elixir flatten
2个回答
0
投票

在这个嵌套级别,您似乎想要使用每个子列表的内容创建一个新列表。

在这种特殊情况下,您可以使用

Enum.reduce/3
来执行此操作,例如:

l = [
  [[1, 2, 3], [4, 5, 6]],
  [[1, 2, 3], [4, 5, 6]]
]

Enum.reduce(l, [], fn sl, acc ->
  acc ++ sl
end)

这将产生:

[[1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6]]

因为你从一个空列表作为累加器开始,然后只需将每个列表的元素直接添加到它即可。


0
投票

只需使用

&Enum.concat/1

Enum.concat([
  [[1, 2, 3], [4, 5, 6]],
  [[1, 2, 3], [4, 5, 6]]
])

退货

[[1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6]]
© www.soinside.com 2019 - 2024. All rights reserved.