Преобразовать список в список кортежей - PullRequest
0 голосов
/ 12 октября 2018

У меня есть список списков, подобных этому:

[
    ["5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42", "1538077790705827"],
     ["5b71d7e458c37fa04a7ce768","5b3f77502dfe0deeb8912b42","1538078530667847"],
     ["5b71d7e458c37fa04a7ce768","5b3f77502dfe0deeb8912b42","1538077778390908"],
     ["5b71d7e458c37fa04a7ce768","5bad45b1e990057961313822","1538082492283531"]
]

Я хочу преобразовать его в список, подобный следующему:

[ 
  {"5b3f77502dfe0deeb8912b42",
   [{"5b71d7e458c37fa04a7ce768","5b3f77502dfe0deeb8912b42", "1538077790705827"},
    {"5b71d7e458c37fa04a7ce768","5b3f77502dfe0deeb8912b42", "1538078530667847"},
    {"5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42" ,"1538077778390908"}
   ]},

{"5bad45b1e990057961313822",
   [{"5b71d7e458c37fa04a7ce768","5bad45b1e990057961313822","1538082492283531"}
   ]}
]

Таким образом, ключ будет создавать кортеж из второгоэлемент в исходном списке

["5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42" , "1538077790705827"],

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Первый, Enum.group_by второй элемент списка.Затем сопоставьте каждое значение значения полученной карты с List.to_tuple.Enum.map при использовании с картой автоматически преобразует каждую пару ключ / значение в кортеж.

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

Вывод:

[
  {"5b3f77502dfe0deeb8912b42",
   [
     {"5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42",
      "1538077790705827"},
     {"5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42",
      "1538078530667847"},
     {"5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42",
      "1538077778390908"}
   ]},
  {"5bad45b1e990057961313822",
   [
     {"5b71d7e458c37fa04a7ce768", "5bad45b1e990057961313822",
      "1538082492283531"}
   ]}
]
0 голосов
/ 12 октября 2018

Я бы использовал карту, чтобы проиндексировать мой список списков согласно второму элементу, а затем преобразовать их, используя Enum.map/2 и List.to_tuple/1.

, если

l = [
    ["5b71d7e458c37fa04a7ce768", "5b3f77502dfe0deeb8912b42", "1538077790705827"],
     ["5b71d7e458c37fa04a7ce768","5b3f77502dfe0deeb8912b42","1538078530667847"],
     ["5b71d7e458c37fa04a7ce768","5b3f77502dfe0deeb8912b42","1538077778390908"],
     ["5b71d7e458c37fa04a7ce768","5bad45b1e990057961313822","1538082492283531"]
]

, то

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)

делает работу.

...