Elixir中最优雅的转化方式
[["A","B","foo"],["A","B","bar"],["A","B","baz"],["C","D","foobar"],["C","D","bla"],["E","F","blabla"]]
成:
[["A","B","foo","bar","baz"],["C","D","foobar","bla"],["E","F","blabla"]]
基本上我想迭代输入列表并按前两个元素进行分组。
答案 0 :(得分:2)
我按Enum.take(2)
分组,然后flat_map
分组Enum.drop(2)
:
[["A","B","foo"],["A","B","bar"],["A","B","baz"],["C","D","foobar"],["C","D","bla"],["E","F","blabla"]]
|> Enum.group_by(&Enum.take(&1, 2))
|> Enum.map(fn {key, value} ->
key ++ Enum.flat_map(value, &Enum.drop(&1, 2))
end)
|> IO.inspect
输出:
[["A", "B", "foo", "bar", "baz"], ["C", "D", "foobar", "bla"],
["E", "F", "blabla"]]
请注意,如果输入列表中的任何项目具有> 3个要素;在这种情况下,它只会连接它们:
[["A","B","foo","z","zz"],["A","B","bar"],["A","B","baz"],["C","D","foobar"],["C","D","bla"],["E","F","blabla"]]
将输出:
[["A", "B", "foo", "z", "zz", "bar", "baz"], ["C", "D", "foobar", "bla"],
["E", "F", "blabla"]]