Reputation: 529
I have a list of lists like this:
[
["5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42", "1538077790705827"],
["5b71d7e458c37fa04a7ce768","5b3f77502dfe0deeb8912b42","1538078530667847"],
["5b71d7e458c37fa04a7ce768","5b3f77502dfe0deeb8912b42","1538077778390908"],
["5b71d7e458c37fa04a7ce768","5bad45b1e990057961313822","1538082492283531"]
]
I want to transform it to a list like:
[
{"5b3f77502dfe0deeb8912b42",
[{"5b71d7e458c37fa04a7ce768","5b3f77502dfe0deeb8912b42", "1538077790705827"},
{"5b71d7e458c37fa04a7ce768","5b3f77502dfe0deeb8912b42", "1538078530667847"},
{"5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42" ,"1538077778390908"}
]},
{"5bad45b1e990057961313822",
[{"5b71d7e458c37fa04a7ce768","5bad45b1e990057961313822","1538082492283531"}
]}
]
So the key will creating tuple out of the second item in the original list
["5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42", "1538077790705827"],
Upvotes: 0
Views: 4363
Reputation: 890
I would use a map to index my list of lists according to the second element, and then transform them using Enum.map/2
and List.to_tuple/1
.
if
l = [
["5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42", "1538077790705827"],
["5b71d7e458c37fa04a7ce768","5b3f77502dfe0deeb8912b42","1538078530667847"],
["5b71d7e458c37fa04a7ce768","5b3f77502dfe0deeb8912b42","1538077778390908"],
["5b71d7e458c37fa04a7ce768","5bad45b1e990057961313822","1538082492283531"]
]
then
l
|> Enum.reduce(%{}, fn [a,b,c], acc -> put_in(acc[b], (acc[b] && acc[b] || []) ++ [[a,b,c]]) end)
|> Enum.map(fn {a,b} -> {a, Enum.map(b, &List.to_tuple/1)} end)
does the work.
Upvotes: 0
Reputation: 222118
First, Enum.group_by
the second element of the list. Then, map every value of the resulting map's value to List.to_tuple
. Enum.map
when used with a map automatically converts each key/value pair to a tuple.
list = [
["5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42", "1538077790705827"],
["5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42", "1538078530667847"],
["5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42", "1538077778390908"],
["5b71d7e458c37fa04a7ce768", "5bad45b1e990057961313822", "1538082492283531"]
]
list
|> Enum.group_by(&Enum.at(&1, 1))
|> Enum.map(fn {k, v} -> {k, Enum.map(v, &List.to_tuple/1)} end)
|> IO.inspect
Output:
[
{"5b3f77502dfe0deeb8912b42",
[
{"5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42",
"1538077790705827"},
{"5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42",
"1538078530667847"},
{"5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42",
"1538077778390908"}
]},
{"5bad45b1e990057961313822",
[
{"5b71d7e458c37fa04a7ce768", "5bad45b1e990057961313822",
"1538082492283531"}
]}
]
Upvotes: 5