Elixir-合并列表元素

Elixir-合并列表元素,elixir,Elixir,我有一张单子 extensions = [ [ %{extension: "zip", size: 3627, type: "archives"}, %{extension: "xml", size: 3627, type: "documents"} ], [ %{extension: "png", size: 458605, type: "graphics"}, %{extension: "png", size: 458605, type: "gra

我有一张单子

extensions = [
  [
    %{extension: "zip", size: 3627, type: "archives"},
    %{extension: "xml", size: 3627, type: "documents"}
  ],
  [
    %{extension: "png", size: 458605, type: "graphics"},
    %{extension: "png", size: 458605, type: "graphics"}
  ]
]
我需要合并列表元素以获得:

extensions = [
    %{extension: "zip", size: 3627, type: "archives"},
    %{extension: "xml", size: 3627, type: "documents"},
    %{extension: "png", size: 458605, type: "graphics"},
    %{extension: "png", size: 458605, type: "graphics"}
]
我找不到正确的解决办法。非常感谢您的帮助。

您可以使用:

您可以使用:


虽然@Daniel提供的答案在这种情况下完全正确,但需要谨慎使用
List.flatten/1
,因为它会深深地变平。对所述问题的确切答案是

扩展
|>:lists.reverse()
|>枚举减少(&++/2)
为了理解差异,让我们考虑下面的输入。

#⇓⇓⇓
扩展名=[[1,2],[3,4]]
列表。展平(扩展)
#⇒ [1, 2, 3, 4]
扩展名|>:lists.reverse()|>Enum.reduce(&++/2)
#⇒ [1, 2, 3, [4]]

虽然@Daniel提供的答案在这种情况下是完全正确的,但我们需要谨慎使用
List.flatte/1
,因为它会变得非常平坦。对所述问题的确切答案是

扩展
|>:lists.reverse()
|>枚举减少(&++/2)
为了理解差异,让我们考虑下面的输入。

#⇓⇓⇓
扩展名=[[1,2],[3,4]]
列表。展平(扩展)
#⇒ [1, 2, 3, 4]
扩展名|>:lists.reverse()|>Enum.reduce(&++/2)
#⇒ [1, 2, 3, [4]]

当心使用
列表。如果要加入的列表中可能有列表,请展平/1
;当要加入的列表中可能有列表时,请小心使用
List.flatten/1
;它变平了。还有
Enum.concat/1
@Dogbert确实如此,但是:))那就是
/2
,你看到上面的
/1
了吗?@Dogbert是的,它遍历了所有元素,基本上在每一步复制累加器。当然,对于像这样的任务,这没什么,但在庞大的列表中,它可能是一个阻碍表演的因素。看起来你是对的。尝试了一个简单的基准测试,您的代码速度更快+这里还有
Enum.concat/1
@Dogbert确实如此,但是:))那就是
/2
,你看到上面的
/1
了吗?@Dogbert是的,它遍历了所有元素,基本上在每个步骤上复制累加器。当然,对于像这样的任务,这没什么,但在庞大的列表中,它可能是一个阻碍表演的因素。看起来你是对的。尝试了一个简单的基准测试,您的代码速度更快+1.
iex> List.flatten(extensions)
[
  %{extension: "zip", size: 3627, type: "archives"},
  %{extension: "xml", size: 3627, type: "documents"},
  %{extension: "png", size: 458605, type: "graphics"},
  %{extension: "png", size: 458605, type: "graphics"}
]